Create channels

Adds a channel to a campaign, or REPLACES the one it already has of that kind, and returns the updated campaign.

POST /v1/campaign/{id}/channels

Addresshttps://api.hanzo.ai/v1/campaign/{id}/channels
MethodPOST
Operationpost_campaign_by_id_channels
AuthAuthorization: Bearer $HANZO_API_KEY

Adds a channel to a campaign, or REPLACES the one it already has of that kind, and returns the updated campaign.

A campaign carries at most one channel per kind, because the kind IS the executor: adding a second "paid" channel would mean two ad accounts running one campaign with no way to tell their results apart. The new channel starts "pending" — adding it does not launch it.

Request

5 fields, body application/json (required).

FieldInTypeRequiredDescription
idpathstringyesID is the campaign to add the channel to, from the path.
accountbodystring—Account is the provider account this channel runs under: an ad-account, a page, or a mailing-list id.
idbodystring—ID is the campaign to add the channel to, from the path.
kindbodystring—Kind is the channel kind and the identity a campaign holds at most one of: paid, organic or email.
platformbodystring—Platform is the provider within the kind — meta, google, x, instagram, or the email provider.

Response

StatusBodyMeaning
200campaign.campaignRecordok
defaultproblem-detailsrefused

200 body — 16 fields.

FieldInTypeAlwaysDescription
audiencebodystring—Audience is an opaque reference to the segment this campaign targets.
budgetbodyinteger (int64)—Budget is the campaign's total budget in CENTS, handed to each executor as the budget for its channel.
channelsbodycampaign.ChannelSpec[]—Channels are the fan-out targets, at most one per kind and at most 12, each carrying its own post-launch state.
channels[].accountbodystring—Account is the provider account this channel runs under: an ad-account, a page or a mailing-list id.
channels[].detailbodystring—Detail is the last outcome in one secret-free line — the failure reason, or what the executor reported.
channels[].externalIdbodystring—ExternalID is the provider-side id of the running execution, recorded by the orchestrator at launch and handed back verbatim to read spend or to pause.
channels[].kindbodystring—Kind is the channel and the identity a campaign holds at most one of: paid, organic or email.
channels[].platformbodystring—Platform is the provider within the kind — meta, google, x, instagram, or the email provider.
channels[].statusbodystring—Status is this channel's own launch outcome, not the campaign's: pending (added, never launched), live, paused, failed (Detail says why) or unavailable (no executor wired on this deployment).
contentbodystring[]—Content is the ordered creative set, at most 32, empty entries dropped.
createdAtbodyinteger (int64)—CreatedAt is when the campaign was created, in unix seconds.
idbodystring—ID is the campaign's server-minted handle — "cmp_" and 128 random bits — and the id every other campaign call is addressed by.
namebodystring—Name is the campaign's display name.
scheduleAtbodyinteger (int64)—ScheduleAt is when the campaign should run, in unix seconds.
statusbodystring—Status is the lifecycle state, server-owned and never accepted from a caller.
updatedAtbodyinteger (int64)—UpdatedAt is the last write in unix seconds — an edit, a launch or a pause.

Failure carries the platform error shape — see Errors.

Examples

hanzo campaign channels create <id>
import { Configuration, CampaignApi } from 'hanzoai';

const api = new CampaignApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postCampaignByIdChannels({ id: 'id', account: "<account>", id: "<id>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import CampaignApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = CampaignApi(client).post_campaign_by_id_channels(id='id', account="<account>", id="<id>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.CampaignAPI.PostCampaignByIdChannels(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, campaign_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = campaign_api::post_campaign_by_id_channels(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.CampaignApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new CampaignApi(client).postCampaignByIdChannels();
curl -X POST https://api.hanzo.ai/v1/campaign/<id>/channels \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "account": "<account>",
       "id": "<id>"
     }'

MCP reaches campaign through the campaign tool, which names its 9 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_campaigns"
         }
       }
     }'

Campaign API · All Hanzo APIs · Interactive reference

Was this page useful?