Run ads
What would 500 clicks on my terms cost? Your agent prices them before you spend, runs the test on your own ad account, and stops spend that does not pay.
You, to your agent
What would 500 clicks on rent collection software cost?
Run the test on my Google account, and stop it if it does not pay.
curl -X POST https://api.sb/leaseline.app/keywords/rent%20collection%20software/measure \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"locale":"en-US","venue":"google-search"}'
curl -X POST https://api.sb/leaseline.app/integrations/connect \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"system":"ads","scope":"startup","grants":["campaigns","budgets","reports"],"venue":"google-search"}'
curl -X POST https://api.sb/leaseline.app/mandates/authorize \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"agent":"agents/agent_7","verb":"Campaign.update","limit":{"spend":2050,"currency":"USD"},"for":"parties/party_1"}'
# Not live yet (gaps #2)
curl -X POST https://api.sb/leaseline.app/campaigns/paid-search/start \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"budget":{"amount":2050,"currency":"USD","per":"test"}}'import { $ } from 'startup-builder'
await $.Keyword.measure({ keyword: 'rent collection software', locale: 'en-US', venue: 'google-search' }) // volume and cost per click, the price of the test
await $.Integration.connect({ system: 'ads', scope: 'startup', grants: ['campaigns', 'budgets', 'reports'], venue: 'google-search' }) // your ad account, once
await $.Mandate.authorize({ agent: 'agents/ agent_7', verb: 'Campaign.update', limit: { spend: 2050, currency: 'USD' }, for: 'parties/ party_1' }) // the stop rule: spend to zero when a paid customer costs more than first-year margin
return await $.Campaign.start({ campaign: 'paid-search', budget: { amount: 2050, currency: 'USD', per: 'test' } }) // the 500-click test on your account · Not live yet, gaps #2
npx startup-builder do Keyword.measure --json '{"keyword":"rent collection software","locale":"en-US","venue":"google-search"}'
npx startup-builder do Integration.connect --json '{"system":"ads","scope":"startup","grants":["campaigns","budgets","reports"],"venue":"google-search"}'
npx startup-builder do Mandate.authorize --json '{"agent":"agents/agent_7","verb":"Campaign.update","limit":{"spend":2050,"currency":"USD"},"for":"parties/party_1"}'
npx startup-builder do Campaign.start --json '{"campaign":"paid-search","budget":{"amount":2050,"currency":"USD","per":"test"}}' # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "await $.Keyword.measure({ keyword: 'rent collection software', locale: 'en-US', venue: 'google-search' }) // volume and cost per click, the price of the test\nawait $.Integration.connect({ system: 'ads', scope: 'startup', grants: ['campaigns', 'budgets', 'reports'], venue: 'google-search' }) // your ad account, once\nawait $.Mandate.authorize({ agent: 'agents/agent_7', verb: 'Campaign.update', limit: { spend: 2050, currency: 'USD' }, for: 'parties/party_1' }) // the stop rule: spend to zero when a paid customer costs more than first-year margin\nreturn await $.Campaign.start({ campaign: 'paid-search', budget: { amount: 2050, currency: 'USD', per: 'test' } }) // the 500-click test on your account · Not live yet, gaps #2"
}
}Response200
application/json{
"$type": "Campaign",
"play": "paid-search",
"venue": "google-search",
"forecast": {
"terms": 6,
"match": "exact",
"averageCpc": 4.1,
"clicks": 500,
"cost": 2050
},
"alreadyPaying": {
"terms": 4,
"longestRunningAd": "since 2026-03-02"
…
sample · 1 Not live yet- Forecast: $0.09; the spend is yours
- First run
- Coming
- Status
- API · browser agent
- Runs by
- Your Google and Meta ad accounts, once. LinkedIn, Reddit and X sign in for the browser agent.
- Connect once
What you get
| Field | What it says |
|---|---|
| Term | The exact term the campaign bids on, with its match type. |
| Forecast | Clicks, cost per click and spend for a month at your bid, read before any spend. |
| Test budget | 500 clicks times the terms’ cost per click: the fewest clicks that read a signup rate. |
| Spend | What the campaign spent, by day and by ad, read from your ad account. |
| Signups | Signups your site recorded from each ad’s clicks. |
| Cost per signup | Spend divided by signups: the first number to read, in week 1. |
| Projected cost per paid customer | Cost per signup divided by your signup-to-paid rate. A blank reads unknown until the first customer pays. |
| Stop rule | The line you set once. When the test is spent and the projected cost per paid customer passes it, spend goes to zero and the report says why. |
How it runs
| When | What happens | Runs by | Your part | Takes |
|---|---|---|---|---|
| Day 0 | Read who already pays for your terms and the ads they keep running, from Size up competitors | API | nothing | minutes |
| Day 0 | Forecast clicks and cost for the exact terms nobody pays for yet, and for the rest (Ad cost forecast) | API | nothing | minutes |
| Day 0 | Connect your ad account and set the first-year margin the stop rule reads (Stop rule) | API | connect once and approve the budget, about 15 min | minutes |
| Day 0 | Turn your saved list into an audience and a lookalike (Audience from your list) | API | nothing | up to a day for the audience to fill |
| Day 1 | Launch the campaign with the ad kit you approved, on Meta by API (Run on your account) | API | nothing | first clicks within a day |
| Day 1 | Build the Google, LinkedIn, Reddit or X campaign in its ad manager, signed in as you (Run where there is no API) | browser agent | nothing | first clicks within a day of the ad’s review |
| Daily | Read spend, clicks and signups for each ad (Spend and results) | API | nothing | the same day |
| Daily | Move budget to the ad that wins and pause the rest (Pause or rebudget) | API · browser agent | nothing | the same day |
| At 500 clicks | Project the cost per paid customer, then keep the winner running or set spend to zero (Stop rule) | API · browser agent | read the verdict, about 5 min | the day the test is spent |
Jobs inside it
Where and how it runs
| Where it works | How it runs | Connect once |
|---|---|---|
| Google Search, Bing, Facebook, Instagram, LinkedIn, Reddit, X | API · browser agent | Your Google and Meta ad accounts, once. LinkedIn, Reddit and X sign in for the browser agent. |
Your agent acts as you on every Venue you authorize. Where a Venue has no API, a browser agent signs in as you and does the steps.
Plays that use it
| Play | Strategy that runs it |
|---|---|
| Paid search | Paid |
| Paid social | Paid |
| Smoke test | Paid |
| Retargeting | Paid |
| Promote winners | Paid |
Reference
Compiled, not written: edit the records it reads (catalog/run-ads), then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.