Deep dive · 13 min read

A year on the Microsoft Advertising API: SOAP is dying, the window is open

Microsoft switches SOAP off on January 31, 2027 and quietly reaches feature parity with Google. What to rebuild first, with the exact REST calls to make.

Illustration of a SOAP envelope dissolving into clean REST/JSON braces, with two deadline markers ahead.
The serious facts are real — the article covers are not.

In short: One clock is real. Microsoft is retiring its SOAP API: new features go REST-only on October 1, 2026, and SOAP switches off completely on January 31, 2027. Everything else is Microsoft quietly reaching feature parity with Google, from PMax and AI Max to generative assets, Google login and import. That parity, plus the fact that almost nobody automates Bing, makes 2026 the year to build.

On the first of April this year, Microsoft published a blog post announcing the end of its SOAP API. I checked the date twice, because burying a protocol funeral in an April 1 post is asking for trouble. It was real. New features stop shipping to SOAP on October 1, 2026, and on January 31, 2027 the whole thing switches off.

Then I did what twenty years in PPC have drilled into me. I opened our codebase at Lynt and checked which connectors still speak SOAP to Bing. Not because the deadline is close. Because an API retirement never breaks anything on the day it’s announced. It breaks a reporting job fourteen months later, mid-quarter, in an account where nobody remembers who wrote the script.

That deadline is the one hard clock in Microsoft’s API year. Everything else the platform shipped is quieter and, honestly, more interesting. Piece by piece, the Bing Ads API caught up with Google. PMax, AI Max, generative assets, Google login, richer import. I’ve spent twelve years writing code against Google’s Ads API, and for most of that time Microsoft’s was the platform you integrated last, grudgingly, if the client insisted. This is the first year where porting a Google automation to Bing costs almost nothing.

And the competition still treats Bing as an afterthought, which is exactly why the window is open. So I’ll walk the year the same way I walked Google’s. For each change, what it is, why it matters for your account, and the exact call or payload to build. Deadline first, opportunity after.

Oct 1, 2026
new features land in REST only
Jan 31, 2027
SOAP API switched off completely
Dec 2025
Google login arrives in the Bing Ads API
May 2026
AI Max for Search opens to pilot

The one hard clock: SOAP is being retired

This is the only dated obligation of the Microsoft year, so it goes first.

What changed. On April 1, 2026, Microsoft announced a hard timeline to move the Advertising API off SOAP and onto REST. Two dates matter:

  • October 1, 2026 is the day new features ship in the REST API only. SOAP stops getting anything new.
  • January 31, 2027 is the day SOAP is switched off completely. Existing SOAP integrations run until then, and not a day after.

The PPC.land and ALM Corp write-ups both confirm the same dates.

Why it matters for your account. If any reporting job, bid script or connector touches Bing through the SOAP SDK, it has an expiry date. And the move is no cosmetic swap. Reporting works differently in REST, the auth flow differs, and error handling changes. A pipeline you forget about will simply stop returning data on January 31, 2027, with no warning beyond a blog post from ten months earlier.

What to do. If your Bing tooling is thin or non-existent, don’t bother porting the old SOAP code. Build REST-first and skip a generation. REST is plain HTTP and JSON. A report goes from a SOAP envelope to a JSON POST against the Reporting endpoint, with an OAuth bearer token and your developer token in the headers:

# OLD: SOAP envelope to ReportingService.svc (off on 2027-01-31)
#   <s:Envelope><s:Body><SubmitGenerateReport>...</SubmitGenerateReport></s:Body></s:Envelope>

# NEW: REST. Submit a report request as JSON.
curl -X POST \
  "https://reporting.api.bingads.microsoft.com/Reporting/v13/GenerateReport/Submit" \
  -H "Authorization: Bearer $OAUTH_TOKEN" \
  -H "DeveloperToken: $DEV_TOKEN" \
  -H "CustomerAccountId: $ACCOUNT_ID" -H "CustomerId: $CUSTOMER_ID" \
  -H "Content-Type: application/json" \
  -d '{ "ReportRequest": { "Type": "CampaignPerformanceReportRequest",
        "Aggregation": "Daily", "Columns": ["TimePeriod","CampaignName","Clicks","Spend"] } }'

(The REST host, the OAuth + DeveloperToken header model and the v13 path are from Microsoft’s docs. Confirm the exact request body for your report against the release notes before you ship.)

The upside of being forced. REST gives you broader language support and a clean fit for modern stacks (Python httpx, n8n, serverless functions), plus far easier debugging than a SOAP envelope. Migration is the chance to rebuild your Bing tooling cloud-native instead of dragging the old design across.

Generative assets, written by the API

With the deadline scheduled, the rest of the year is parity. Google already taught you how to use every piece of it.

What changed. February 2025 (SDK 13.0.24) shipped recommendation endpoints. CreateResponsiveSearchAdRecommendation, CreateAssetGroupRecommendation and CreateResponsiveAdRecommendation, each with a Refine… counterpart. July 2025 (13.0.25) added a job-based variant and brand-kit recommendations, and February 2026 added AutoGeneratedAssetsEnabled to RSA settings. All from the release notes.

Why it matters for your account. Ad-copy generation and iteration is now scriptable instead of a UI-only chore. That is the difference between hand-writing copy for ten asset groups and generating it for hundreds.

What to do. Wire the recommendation endpoints into the creative workflow you already run for Google. Generate, refine against the brand kit, push:

feed/product → CreateResponsiveSearchAdRecommendation
            → RefineResponsiveSearchAdRecommendation (brand-kit term exclusions)
            → push to ad group  (no manual copy-paste from the UI)

Bing becomes another output channel of your existing ad-copy pipeline instead of a separate hand-built one.

AI Max for Search, with an API switch

What changed. AI Max for Search opened to pilot in May 2026, with the API hook AISearchSetting in Campaign Management. It brings expanded query matching, asset personalization and smart URL routing, the same post-keyword trend as Google’s AI Max, and it exposes the guardrails through the API. Brand inclusions and exclusions, term exclusions, messaging restrictions. Search Engine Land covered the launch alongside Microsoft’s broader agentic-web push.

Why it matters for your account. If you already run a DSA-to-AI-Max migration on Google, the playbook transfers to Microsoft almost one for one. So does the trade. You gain reach and hand over matching and URL choice, which makes the guardrails the part you don’t skip.

What to do. Set AISearchSetting on the campaign and deploy your brand-kit guardrails programmatically across accounts, the way you do on Google:

{
  "AISearchSetting": { "Enabled": true },
  "BrandKit": {
    "TermExclusions": ["competitor-name", "off-brand-claim"],
    "MessagingRestrictions": ["no superlatives without proof"]
  }
}

(AISearchSetting and the brand-kit exclusions are real Campaign Management additions from March and May 2026. The exact object nesting is illustrative. AI Max is still a pilot, so confirm the schema and GA status in the release notes right before you build against it.)

Verify AI Max dates before you commit. It’s an open pilot, and pilot timelines move fast. Check the current status in the release notes on the day you build, not the day you read this.

Porting your Google setup just got cheap

The clearest theme of the year is convergence. Microsoft made it cheap to bring your Google setup over.

Google login (Dec 2025, 13.0.26)

GoogleOAuthDesktopMobileAuthCodeGrant / GoogleOAuthWebAuthCodeGrant let you authenticate the Bing Ads API with the same Google identity you use for Google Ads. A March 2026 fix preserved the Google refresh token.

Richer Google import (Mar 2026, 13.0.27)

New import options: NewPortfolioBidStrategy, NewAIMaxSettings, topic targets. The May 2026 Import Center adds step-by-step error diagnostics and import filtering.

Performance Max parity

PMax via API is in worldwide open beta, with AutoGeneratedImageOptOut / AutoGeneratedTextOptOut, PageFeedIds and campaign-level negative age/gender.

New Customer Acquisition (Feb 2025)

NCA goals are fully scriptable, and 2026 added import of NCA goals straight from Google PMax.

Why it matters for your account. What you build on Google now ports to Bing at close to one to one. With Google login you don’t even maintain a second OAuth mental model, because the same Google identity authenticates both:

# Authenticate the MICROSOFT API with your existing Google identity (Dec 2025+).
# GoogleOAuthWebAuthCodeGrant is a Bing Ads SDK auth class, not a raw grant_type.
from bingads.authorization import GoogleOAuthWebAuthCodeGrant

authentication = GoogleOAuthWebAuthCodeGrant(
    client_id=CLIENT_ID, client_secret=CLIENT_SECRET, redirect_url=REDIRECT_URI,
)
# one OAuth flow across Google Ads + Microsoft Advertising;
# a March 2026 fix preserves the Google refresh token between runs.

What to do. Pick the single Google job with the highest payoff (NCA goals and generative assets are the usual first picks) and port it to Bing as a pilot. The auth and import work is already done for you, so the port is mostly reading your own Google code. (The Google-OAuth grant classes are real SDK additions from December 2025. Confirm the exact constructor and auth flow against the release notes, because it’s an SDK helper rather than a token-endpoint grant value.)

Measurement grew up

Three upgrades make Bing data finally easy to wire into your own BI and CRM:

The measurement upgrades worth wiring in

  • MSClickIdPerformanceReport (May 2026) Join MSCLKID to CRM orders for true ROAS
  • BidStrategyReport (Dec 2025) Bid-strategy performance without UI scraping
  • DataDriven attribution via API Set the model in code, not by hand in the UI
  • Offline conversions by goal ID (Mar 2026) Cleaner server-side pipelines, plus ConversionDelay

Why it matters for your account. MSClickIdPerformanceReport is the one to reach for first. We run customer-level business reporting for clients in BigQuery, and the most valuable join in it is click ID to CRM order, because a CRM join replaces platform-reported ROAS with the real number. On Google that join runs on GCLID. This report gives Bing the same seam. And the report itself is just another REST submit against the v13 Reporting endpoint, so it drops straight into the migration from the first section.

Shopping, meanwhile, has quietly consolidated. The legacy Content API v9.1 is effectively frozen (last change in 2024). Modern Microsoft Shopping runs through Microsoft Merchant Center plus Bing Ads v13, which means PMax asset groups, listing-group paths and the FeedItemPerformanceReport.

On the horizon: ads inside the chatbot

The most forward-looking thread is Microsoft’s bet on agentic commerce. At Activate 2026 it rolled out Copilot Checkout, buying directly inside the chat, alongside Brand Agents for Shopify and ad placements beneath Copilot’s conversational answers, with Performance Max surfacing under those results. The marketing commentary frames it as Microsoft going AI-first, a genuinely new shopping surface rather than another ad slot.

For now this is more watch-this-space than automate-today, but it has a concrete prerequisite, and I take it seriously. We spent two years building Boostera, our tool that enriches Google Merchant Center feeds with AI, precisely because feed quality is the ceiling on every automated shopping surface. The same rule holds here. A product shows up cleanly in an AI answer only if its feed data and messaging are in order, so the unglamorous feed work is what positions a store for the conversational channel.

On the creative side, the year also shipped HTML5 assets via the API (AddHTML5s, March 2026) and Video Animation (static image to video asset, November 2025). Cheap ways to feed richer formats without a production team.

The year on one timeline

Every v13 entry below comes from the Bing Ads API release notes (last updated June 5, 2026), the platform announcements from the Microsoft Advertising blog. The only hard deadlines are the two SOAP dates, flagged HARD. The EU political-ads row is a compliance obligation, and everything else is opt-in upside. The right-hand column tells you which is which.

DateSDK / eventWhat landedClock?
2025-02 v13.0.24Generative AI recommendation APIs; New Customer Acquisition goal via APIupside
2025-07 v13.0.25Job-based recommendations; brand kit; new performance reportsupside
2025-09 v13.0.25.3EU political ads; mandatory IsPolitical before create/importcompliance
2025-11 PlatformVideo Animation (static image to video asset)upside
2025-12 v13.0.26Google login; TopicCriterion; data-driven attribution; BidStrategyReportupside
2026-03 v13.0.27HTML5 assets; LinkedIn segments; CustomSegment; AISearchSetting; richer Google importupside
2026-04 PlatformSOAP to REST transition announced; AI Max + agentic web at Activate 2026announce
2026-05 v13.0.28MSClickIdPerformanceReport; billing APIs; PMax negative age/gender; Import Centerupside
2026-10-01 REST onlyNew features ship to REST only; SOAP gets nothing newHARD
2027-01-31 SOAP OFFSOAP switched off completely; migrate before this dateHARD

Where I’d start tonight

Not with the whole migration. With a grep. Search your codebase for ReportingService.svc and the SOAP SDK imports, and write down every job that comes back. That list is your January 31, 2027 exposure, and it took you ten minutes.

Then pick one Google automation you’re proud of and ask what it would earn on a platform where your competitors haven’t shown up yet. The parity work is done. The window is open. Which job will you port first?

Take it with you

Download the full quarter plan for your AI

Everything above, rewritten as a step-by-step brief you can paste straight into Claude or any capable coding agent. It audits your codebase for SOAP exposure, rebuilds your reporting REST-first, ports your first Google job to Bing and wires MSCLKID into your CRM. Leave your email and the file is yours.

One file, one list. I only write when there's something worth reading.

FAQ

When does my SOAP integration actually stop working?

SOAP keeps running until January 31, 2027, when it is switched off completely. From October 1, 2026 no new features ship to SOAP, so any new capability you want is REST-only after that date.

Is REST a drop-in replacement for the SOAP SDK?

No. Reporting, auth flow and error handling all differ. A report goes from a SOAP envelope to a JSON POST with an OAuth bearer token and your developer token in the headers. Treat it as a rebuild onto plain HTTP and JSON rather than a config change.

What does Google login in the Bing Ads API actually give me?

You authenticate the Microsoft API with the same Google identity you use for Google Ads (GoogleOAuth…AuthCodeGrant, December 2025). A multi-platform tool then shares one OAuth mental model and less credential-management code. A March 2026 fix preserved the Google refresh token.

Is Microsoft's AI Max generally available?

As of this writing it’s an open pilot (since May 2026), with the AISearchSetting API hook. Pilot timelines shift quickly, so check the release notes and confirm the schema before building against it.

Which upgrade has the fastest payback?

MSClickIdPerformanceReport (May 2026). Stitch MSCLKID to your CRM orders and you get true ROAS instead of platform-reported numbers. It’s the same join you already run on Google’s GCLID, so the pattern is familiar and the value is immediate.

Why bother automating Bing at all?

Because the API just reached feature parity with Google, from PMax and AI Max to NCA, generative assets, Google login and import, while almost no one automates over it. The window is open precisely because your competitors aren’t here yet.

The point of all this

Want this level of visibility in your account?

One e-mail. I'll tell you honestly whether it's worth it for your setup.

Get in touch →