Skip to content

Microsoft Ads

Your agent copies the Google campaign that already works to Bing, signed in as you, and reads what Bing searchers click and buy.

Connect
Sign in once, 3 grants
First run
Forecast Bing clicks and cost for your 10 best exact terms, about 90¢
Sites
Bing
Campaign.create
You, to your agent

Copy my Google exact-match rent campaign into Microsoft Ads at $10 a day, and show me what it would bring over.

curl -X POST "https://api.sb/leaseline.app/campaigns/create?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"venue":"bing","copyFrom":"campaigns/google-rent-exact","budget":{"amount":10,"currency":"USD","per":"day"}}'
npx startup-builder do Campaign.create --try --data '{"venue":"bing","copyFrom":"campaigns/google-rent-exact","budget":{"amount":10,"currency":"USD","per":"day"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Campaign.create({ venue: 'bing', copyFrom: 'campaigns/google-rent-exact', budget: { amount: 10, currency: 'USD', per: 'day' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Campaign.create({ venue: 'bing', copyFrom: 'campaigns/google-rent-exact', budget: { amount: 10, currency: 'USD', per: 'day' } })
Response
{
  "$type": "Campaign",
  "mode": "try",
  "stored": false,
  "venue": "bing",
  "copiedFrom": "google-ads",
  "adGroups": 4,
  "keywords": 14,
  "negatives": 22,
  "ads": 8,
  "budget": {
    "amount": 10,
    "currency": "USD",
    "per": "day"
  },
  "runsBy": "browser",
  "steps": 18
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

Connect once

  1. Call Integration.connect with system: 'ads' and venue: 'bing', then open the connectUrl it returns and sign in as the Microsoft account that holds your Microsoft Ads account.
  2. Sign in once more in the browser window the platform opens; that saved session runs the import and every change.
  3. Set the spend on your standing approval with Mandate.authorize; Microsoft bills your account, never the platform.
GrantWhat it unlocksScope
Your Microsoft Ads accountCampaigns, ad groups with their bids, ads with their headlines and URLs, and keywords with their match typeshttps://ads.microsoft.com/msads.manage
Stay connectedYour agents keep reading without you signing in each dayoffline_access
Your saved sessionThe Google import, new campaigns and every budget change, done in Microsoft Ads’ own screensbrowser session: ads.microsoft.com
ToDo this
PauseIntegration.pause stops every call through Microsoft at once and keeps the token; Integration.resume picks up from the same cursor.
ReconnectIntegration.reconnect returns a fresh connectUrl that lasts one hour, and keeps the Integration's id and cursor, so nothing imports twice.
DisconnectIntegration.revoke revokes the token with Microsoft; every record it brought in stays in your records.

What your agents do

AskVerbRuns throughPrice
Copy my Google exact-match campaign into Microsoft Ads at a fifth of its budget, signed in as me.Campaign.createA browser agentAbout 1.6¢ a step
Add the winning headline as a new ad, signed in as me.Ad.createA browser agentAbout 1.6¢ a step
Raise the Bing budget to $15 a day, signed in as me.Campaign.updateA browser agentAbout 1.6¢ a step
Show me my Bing campaigns, ad groups and keywords with their bids.Metric.queryYour accountFree

Calls on your own account are free; Microsoft bills your spend directly.

Reading this site’s public data needs no account: Keyword.forecast is a Data call (the three ways a call runs).

What it holds

NounThe account’s objectWhenWhich side leads
CampaigncampaignYour agent imports or builds itYour records
Adresponsive search adYour agent imports or builds itYour records
KeywordkeywordYour agent imports itThe account

Events and webhooks

DirectionEvent
EmitsCampaign.created, Campaign.updated, Ad.created, Entry.posted

Any Event can wake a Workflow, and a Watch delivers it to your endpoint, signed (Events and webhooks).

Limits

WhatLimitCall
Ads per ad groupThree enabled responsive search ads; a fourth waits until one is pausedAd.create
What the import copiesCampaigns, ad groups, keywords, ads and negatives as they stand in Google Ads; the agent then sets the budget your standing approval allowsCampaign.create
Ad reviewMicrosoft reviews every ad; a disapproval comes back as venue-rejected with the reasonAd.create
SpendYour standing approval holds the cap; a budget change past it waits with over-mandateCampaign.update
A day’s spendMicrosoft may spend up to twice the daily budget on a busy day, and never more than the daily budget times 30.4 in a month; your standing approval’s cap is set on the month for that reasonCampaign.create

Start here

MoveThe rule
StructureCopy the Google campaign only once it has 500 clicks read and terms that convert: the same exact terms, ads and negatives, nothing new.
BudgetA fifth of the Google daily budget to start, moved up only on cost per signup.
CreativeThe Google ads as they are; change only what Bing’s own search terms show is wrong.
Kill ruleThe Google rule: at 500 clicks, stop if cost per signup at the interval’s upper bound fails break-even, and scale only when the lower bound passes.
BenchmarkSource
Start at a fifth of the Google budgetOur planning number
500 clicks before a stop, hold or scale call; no signup in 150 clicks stopsOur calculation, the same rule as Google Ads

Field map

Our fieldMicrosoft Ads’s fieldNotesCalls
Campaign.objectivecampaign goalSet in Microsoft Ads’ own screens; leads bids toward the signup conversion the import brings overCampaign.create, Campaign.update, Ad.create
Campaign.budgetcampaign daily budgetNone.Campaign.create, Campaign.update, Ad.create
Campaign.statecampaign statuslive is Active, paused PausedCampaign.update
Campaign.keywordskeyword text and match typeExact unless the term says otherwise; phrase and broad on requestCampaign.create
Campaign.negativescampaign negative keywordsNone.Campaign.create, Campaign.update
Campaign.bidad group default bid, or the bid strategylowest-cost is maximize clicks; a costPer cap is a manual CPC bidCampaign.create, Campaign.update
Campaign.targetinglocation targetingCountries and regions; Microsoft also shows ads to people searching about a place unless you set people in itCampaign.create
Campaign.startsAtad group start dateNone.Campaign.create
Ad.headlineresponsive search ad headlinesUp to 15, each 30 charactersAd.create
Ad.bodyresponsive search ad descriptionsUp to 4, each 90 charactersAd.create
Ad.landingUrlfinal URLNone.Ad.create
Ad.pathdisplay URL path 1 and path 215 characters each, shown after your domainAd.create

What try does here

Returns what the import would bring over, term by term with the budget it would set, and the steps the browser agent would take; no session opens and nothing changes.

How long a connection lasts

A connection lasts 90 days from its last use: Microsoft replaces the refresh token on every use, and your agents use it daily.

The platform asks you to reconnect 7 days before it runs out; until you do, a call that needs it refuses with needs-reauth.

Formats

SiteFormatSizeLimits
BingResponsive search adNone.Up to 15 headlines of 30 characters and 4 descriptions of 90; three enabled per ad group

Plays and strategies

KindWhere
PlaysPaid search, Promote winners
StrategiesPaid

Used by

No Workflow, agent task or Service acts through it yet: your agents call it directly.

Reference

4 calls, each with its path and price
CallPathPrice
Campaign.createPOST /campaigns/createAbout 1.6¢ a step
Ad.createPOST /ads/createAbout 1.6¢ a step
Campaign.updatePOST /campaigns/updateAbout 1.6¢ a step
Metric.queryPOST /metrics/queryFree

Contents