Every campaign is created against a matchToken from one of three searches. The token fixes the channel set: campaign creation buys exactly the channels cached under it, and a channel outside that search can never be bought by that campaign.
Three ways to search
From your ad copy
From a sentence
Look-alikes
Derives the search from the text plus the project’s AI context. The ad copy here is used only as a brief — it is deliberately not judged as publishable copy, because this request carries no destinationUrl and the foreign-domain rule cannot be evaluated without one. Validate separately. One sentence carries several kinds of requirement, and each is routed to where it can be enforced: the subject matter becomes the semantic query, the audience language becomes a language filter, stated numbers become audience filters, and negations become instructions to the relevance classifier — the only step that can honour a “no …”.This search needs no project AI context; the prompt says everything. projectId is still required because the token is bound to it. Seeds are averaged into one query point, not searched for one by one. Seeds that sit close together describe a single kind of channel and give a sharp result; scattered seeds average into a vague point in the middle and give a vague one. Pick channels that belong together.
Don’t know what to ask for? POST /api/v1/campaigns/generate-channel-prompt writes a prompt on your behalf from your ad copy, capped at 300 characters — a search box, not a brief. Drop it straight into match-channels-by-prompt.
Extending a selection instead of replacing it
Pass the previous matchToken to a look-alike search and the seeds are carried into the new list, at its head, with relevancy: 1. The selection extends.
Omit the token and the response carries the look-alikes alone — the seeds are gone from it, and since a campaign buys only what is cached under the token it consumes, those seeds could no longer be bought at all.
Seeds never come back among the look-alikes themselves: a seed is its own closest look-alike and would fill the top of the answer. They are re-added from matchToken when one is given. A token belonging to another user, project or platform is refused; an expired one is treated as absent.
Reading the results
Checking how you were read
filters comes back only from match-channels-by-prompt — the only search that infers its filters rather than being told them. It reports what was read out of your sentence, so 20K+ subscribers appears as minSubscribers: 20000. If that is not what you meant, reword and search again.
An absent field means no such filter narrowed the search. ranking (balanced, max_reach, max_engagement) and minManagerContactConfidence (any, low, medium, high) always come back, because the search always ranks somehow and always applies a contact requirement.
Striking channels off
You do not have to buy everything a search returned. Pass excludedChannelIds to campaign creation and those channels become neither placements nor part of the queue behind them — the campaign can never come back to one of them later. Ids outside the previewed set are ignored; a strike-out list that leaves nothing at all is a 400.