Two dimensions, three modes
Each dimension takes one mode:
What each mode does in Semicola today:
inventorySelection: "automatic": the platform owns product selection. You pick products with auto-select, and manual staging is refused:save_media_buy(products or a proposal) andPOST /api/v2/buyer/media-buys/batchanswer409 CONFLICTwithdetails.reason: "automatic_inventory_selection"(“This campaign’s inventory selection is automatic, so the platform picks its products and manual staging is refused. Set autonomy.inventorySelection to manual or propose to stage products yourself.”).inventorySelection: "manual"or"propose": you stage products yourself from proposals or discovery (see Media buys and packages); auto-select is refused.inventorySelection: "automatic"also lets Semi runauto_select_productswithout asking for a yes each time. Auto-select stays inside the campaign budget and contacts no seller.rebriefing: "automatic": asave_campaignupdate that changes only the brief applies without asking for a yes. Any other change in the same call (budget, flight, name, phase) still asks. Withmanualorpropose, every brief change asks.
Set autonomy
Passautonomy when you create or update a campaign (save_campaign, POST /api/v2/buyer/campaigns
or PUT /api/v2/buyer/campaigns/{id}). Each dimension is optional, but at least one must be present;
an omitted dimension keeps its current value.
autonomy, it copies its advertiser’s setting. Advertisers
created in Semicola start at manual for both dimensions (change that with save_advertiser or
PUT /api/v2/buyer/advertisers/{id}). When neither the campaign nor its advertiser has a saved value,
the effective mode is manual.
Read it
Campaign reads returnautonomy as saved ({ "inventorySelection": …, "rebriefing": … }), or null
when nothing is saved on the campaign. The campaign workspace shows the effective modes under
Controls as Inventory selection and Re-briefing (Manual, Propose or Automatic),
marked when the campaign differs from its advertiser. Autonomy is per campaign: changing one campaign
doesn’t change the others.
Auto-select products
Auto-select picks a product set for a draft campaign from its discovery session and splits the budget across it. It contacts no seller: the result is staged draft buys you review and launch as usual.
The campaign must be
DRAFT, have autonomy.inventorySelection: "automatic", have a discovery
session (run discover_products or request_proposals for it first) and have a budget. Otherwise the
call answers 400 VALIDATION_ERROR naming what’s missing.
Each call replaces the previous selection: earlier draft buys on the campaign are archived and the
new products are staged, one draft buy per seller (and per channel group when the
campaign defines groups). Pass product ids exactly as discovery returned them.
The answer carries
discoveryId, selectedProducts[] (productId, name, salesAgentId,
groupId, groupName, cpm, budget, pricingOptionId, channelGroupId), budgetContext
(campaignBudget, totalAllocated, remainingBudget, currency), productCount,
previouslySelectedCount, a selectionRationale and the selectionMethod:
Refinement asks are read as channel preferences: “more video” favors online video and CTV products,
“less display” ranks display lower, and “no display” drops it.
include keeps a product in the set,
omit drops it, and moreLikeThis favors products on the same channels.