Skip to main content

Advertising on Penguin

Reach users at the moment of intent — when they're actively looking for solutions in AI-powered conversations.

Getting started

1. Create an account

import { PenguinClient } from 'penguin-sdk';

const client = new PenguinClient({ apiKey: 'am_test_any' });

const account = await client.advertiser.signup({
email: 'ads@yourcompany.com',
password: 'secure_password',
company_name: 'Your Company',
});

2. Log in and create a campaign

const session = await client.advertiser.login({
email: 'ads@yourcompany.com',
password: 'secure_password',
});

const campaign = await client.advertiser.createCampaign(session.jwt!, {
name: 'Summer Promotion',
ad_type: 'link',
budget: 5000, // $50.00 total budget
bid_cpc: 50, // $0.50 per click bid
creative: {
title: 'Summer Sale — 50% Off',
body: 'Limited time offer on all plans. AI-powered tools for your team.',
cta: 'Claim Offer',
landing_url: 'https://yoursite.com/summer-sale',
},
targeting: {
categories: ['IAB22'], // Shopping
keywords: ['project management', 'team tools'],
},
});

3. Monitor performance

const analytics = await client.advertiser.getAnalytics(session.session_token, {
group_by: 'day',
});

console.log(analytics.summary);
console.log(analytics.by_campaign);

Campaign types

Traditional click-through ads. You provide a title, body, CTA, and landing URL. You pay per click.

Dynamic capabilities

Interactive AI-powered sessions. Users can have conversations with your business agent to get quotes, compare plans, book appointments, etc. You pay when a session starts.

To create a dynamic capability campaign, set capability_enabled: true and provide a capability_config with your system prompt, business docs, and optional API endpoints.

Pricing

  • Budget range: $10 – $100,000 per campaign
  • Bid range: $0.01 – $100.00 per click/session
  • Auction: Second-price — you pay $0.01 more than the next highest bid
  • Quality multiplier: Higher quality scores mean lower effective costs

Managing campaigns

// Pause a campaign
await client.advertiser.updateCampaign({
campaign_id: campaign.campaign_id,
session_token: session.session_token,
status: 'paused',
});

// Resume
await client.advertiser.updateCampaign({
campaign_id: campaign.campaign_id,
session_token: session.session_token,
status: 'active',
});