Keystone Developers
Open Keystone
API reference

Console API

Ads campaigns

13 endpoints.

GET/api/v1/admin/businesses/{business_id}/ads/campaigns

List campaigns

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
statusquerystring | null
platformquerystring | null
qquerystring | null
cursorquerystring | null
limitqueryintegerdefault 20
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_CampaignData__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData[]
CampaignData[] fields
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
statusrequiredenumone of "draft", "active", "paused", "archived"
platformrequiredenumone of "meta", "google"
adSetCountrequiredinteger
adUnitCountrequiredinteger
budgetLabelrequiredstring
adSetsAdSetData[]
AdSetData[] fields

Nested object (not expanded)

costPerLeadnumber | null
costPerLeadTrendPercentinteger | null
reachinteger | null
leadsinteger | null
targetingCitystring | null
targetingRadiusMilesinteger | null
budgetDailyUsdinteger | null
isClientCreatedboolean | null
currencyCodestringdefault "USD"
leadFollowUpEnabledbooleandefault false
createdViaenumone of "manual", "agent", "external" · default "manual"
isExternallyManagedbooleandefault false
isManagedbooleandefault true
startedAtstring | null
objectivestring | null
budgetLevelstringdefault "ad_set"
dailyBudgetMinorinteger | null
bidStrategystringdefault "LOWEST_COST_WITHOUT_CAP"
bidAmountMinorinteger | null
externalPlatformCampaignIdstring | null
predecessorCampaignIdstring (uuid) | null
performanceFlagCampaignListFlagSummary | null
CampaignListFlagSummary fields

CampaignListFlagSummary (not expanded)

metadataResponseMetadata | null
ResponseMetadata fields
FieldTypeDescription
paginationPaginationMetadata | null
PaginationMetadata fields
FieldTypeDescription
limitrequiredinteger
next_cursorstring | null
prev_cursorstring | null
has_morerequiredboolean
has_prevbooleandefault false
total_countinteger | null
status_countsobject | null
object | null fields

Map of string to integer

lifecycle_countsLifecycleCounts | null
LifecycleCounts fields
FieldTypeDescription
leadintegerdefault 0
prospectintegerdefault 0
customerintegerdefault 0
former_customerintegerdefault 0
classification_countsClassificationCounts | null
ClassificationCounts fields
FieldTypeDescription
signalobject
object fields

Nested object (not expanded)

touchobject
object fields

Nested object (not expanded)

stageobject
object fields

Nested object (not expanded)

metaResponseMeta | null
ResponseMeta fields
FieldTypeDescription
totalinteger | null
total_countinteger | null
pageinteger | null
per_pageinteger | null
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns

Create a draft campaign

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonCampaignCreateBody
FieldTypeDescription
namerequiredstring
platform"meta"default "meta"
objectiveenumone of "OUTCOME_LEADS", "OUTCOME_TRAFFIC", "OUTCOME_SALES" · default "OUTCOME_LEADS"
adsAccountIdstring (uuid) | null
leadFollowUpEnabledbooleandefault true

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}

Get a campaign with embedded ad-sets and units

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
refreshFromMetaqueryboolean

When true (default), pull this campaign's latest state from Meta and reconcile SOR before returning — the SAME full sync as the per-campaign Sync button, but due-gated (``ads_campaign_sync_min_interval_seconds``) so opening the page repeatedly doesn't hammer Meta. Set ``refreshFromMeta=false`` to read SOR only.

default true
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

PATCH/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}

Patch campaign name (status changes use dedicated verbs)

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonCampaignPatchBody
FieldTypeDescription
namestring | null
leadFollowUpEnabledboolean | null
isManagedboolean | null
objectiveenum | null
budgetLevelenum | null
dailyBudgetMinorinteger | null
bidStrategyenum | null
bidAmountMinorinteger | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/archive

Archive locally + cascade soft-delete children

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/duplicate

Deep-copy campaign + sets + units as a new draft

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/launch

Validate + push to provider + set Active

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
Idempotency-Keyrequiredheaderstring
authorizationheaderstring | null

Request bodyrequired

application/jsonCampaignLaunchBody
FieldTypeDescription

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/pause

Pause on provider + locally

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/resume

Resume on provider + locally

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/{campaign_id}/sync

Pull this one campaign's latest state from Meta and return it

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
campaign_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignData
CampaignData fields

CampaignData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/agent

Trigger the campaign-creation agent (workflow engine)

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
Idempotency-Keyheaderstring | null
authorizationheaderstring | null

Request bodyrequired

application/jsonCampaignAgentTriggerBody
FieldTypeDescription
promptrequiredstringmin length 1
adsAccountIdstring (uuid) | null
campaignIdstring (uuid) | null
adSetIdstring (uuid) | null
unitIdstring (uuid) | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignAgentTriggerData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignAgentTriggerData
CampaignAgentTriggerData fields
FieldTypeDescription
workflowRunIdrequiredstring
threadIdrequiredstring
statusrequiredstring
assistantReplystringdefault ""
metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/businesses/{business_id}/ads/campaigns/agent/messages

List campaign-agent chat transcript

Return the persisted chat transcript for a thread.

The POST relay (``/agent/messages``) only returns the latest assistant reply per turn, so user-typed messages disappear from the FE on refresh. This GET reads the workflow-engine's ``thread_events`` (via control-plane ``/threads/{id}/detail``) and reduces them to the chat-message subset so the FE can render the full transcript and survive page reloads.

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
threadIdrequiredquerystring
limitqueryintegerdefault 200
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_ChatTranscriptData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredChatTranscriptData
ChatTranscriptData fields
FieldTypeDescription
threadIdrequiredstring
messagesrequiredChatMessageData[]
ChatMessageData[] fields

ChatMessageData (not expanded)

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/ads/campaigns/agent/messages

Send a follow-up turn on an existing agent thread

Multi-turn relay so the FE doesn't need to talk to the router directly. The initial ``POST /campaigns/agent`` may return an empty ``workflowRunId``; keep POSTing here with the same ``threadId`` until a workflow run is started and a proposal widget appears.

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonCampaignAgentMessageBody
FieldTypeDescription
threadIdrequiredstringmin length 1
messagerequiredstringmin length 1
campaignIdstring (uuid) | null
adSetIdstring (uuid) | null
unitIdstring (uuid) | null

Responses

200Successful Response
application/jsonSuccessResponse_CampaignAgentTriggerData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredCampaignAgentTriggerData
CampaignAgentTriggerData fields

CampaignAgentTriggerData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.