New endpoint:
Use it to host proof of consent when submitting
Request:
Response:
Errors:
View documentation
POST /v1/sms/registrations/{id}/opt-in-proof uploads an SMS opt-in form screenshot/PDF and returns a public URL you can include in an appeal.Use it to host proof of consent when submitting
POST /v1/sms/registrations/{id}/appeal (add the returned URL to your messageFlow).Request:
multipart/form-data with file (PNG/JPG/WebP/GIF/PDF, max 4MB)Response:
{ "url": "..." }Errors:
404 registration not found, 422 unsupported type/too largeView documentation
SMS carrier registration now accepts optional policy URLs on 10DLC campaigns via
You can include privacy/terms links in the
New
•
•
Also,
View documentation
POST /v1/sms/registrations.You can include privacy/terms links in the
campaign object to help carrier reviewers validate compliance.New
campaign properties:•
privacyPolicyLink•
termsAndConditionsLinkAlso,
embeddedLink and embeddedPhone now document auto-derivation from your sample messages when omitted.View documentation
POST
Set
New field:
View documentation
/v1/sms/messages now supports scheduling via sendAt.Set
sendAt (ISO 8601 date-time with offset) to queue an SMS/MMS for a future time; it must be in the future. The message is queued and the message.delivered webhook fires when it actually sends.New field:
sendAtView documentation
New endpoint
Send
Response:
Errors:
View documentation
POST /v1/sms/opt-in-proof uploads SMS opt-in proof (screenshot/PDF) and returns a public URL you can include in a campaign’s messageFlow for carrier review.Send
multipart/form-data with file (PNG/JPG/WebP/GIF/PDF, max 4MB).Response:
{ "url": "..." }Errors:
422 unsupported type/too large, 401 unauthorized. Alias: /v1/sms/registrations/{id}/opt-in-proof.View documentation
New LinkedIn-only Ads helpers are available:
• Suggested bid & budget bounds via
Returns suggested bid + allowed bid limits and daily budget bounds for a targeting spec (use before
Key request fields:
Response:
• Impressions/clicks/spend forecast via
Forecasts metrics for a targeting spec over a future time range.
Key request fields:
Response:
For non-LinkedIn accounts, both endpoints return
View documentation
• Suggested bid & budget bounds via
POST /v1/ads/targeting/bid-pricingReturns suggested bid + allowed bid limits and daily budget bounds for a targeting spec (use before
POST /v1/ads/create).Key request fields:
accountId, adAccountId, spec, optional campaignType (TEXT_AD/SPONSORED_UPDATES/SPONSORED_INMAILS), bidType (CPM/CPC/CPV), matchType (EXACT/AUDIENCE_EXPANDED), dailyBudget.Response:
available and pricing (may be null).• Impressions/clicks/spend forecast via
POST /v1/ads/targeting/supply-forecastForecasts metrics for a targeting spec over a future time range.
Key request fields:
accountId, adAccountId, spec, timeRangeStart, timeRangeEnd, plus either dailyBudget or totalBudget. For manual bidding, set competingBid with bidType (CPM/CPC/CPV) and amount; for auto-bidding, set optimizationTarget.Response:
available and forecast series with metricType and granularity (DAILY/SEVEN_DAY/THIRTY_DAY/CUSTOM).For non-LinkedIn accounts, both endpoints return
available: false (not an error).View documentation
LinkedIn now supports Thought Leader ads on
This lets you create a LinkedIn ad that references an existing post (share/ugcPost) as the creative, while still using the normal
Set:
•
Notes:
• Mutually exclusive with other LinkedIn creative sources in
• When using
View documentation
POST /v1/ads/create via platformSpecificData.thoughtLeader.This lets you create a LinkedIn ad that references an existing post (share/ugcPost) as the creative, while still using the normal
/v1/ads/create flow for targeting/bidding/schedule.Set:
•
platformSpecificData.thoughtLeader.postUrn (pattern: urn:li:share:\d+ or urn:li:ugcPost:\d+)Notes:
• Mutually exclusive with other LinkedIn creative sources in
platformSpecificData (e.g. carousel, document, conversation, etc.)• When using
thoughtLeader, you don’t need headline/body/imageUrl/organizationId for the creative (the referenced post provides them).View documentation
New endpoint:
This terminates the carrier registry campaign so recurring monthly campaign fees stop; numbers under the registration can no longer send texts (receiving is unaffected). Deactivation is irreversible and the operation is idempotent.
Key parameter:
Response:
View documentation
DELETE /v1/sms/registrations/{id} to deactivate an SMS brand/campaign registration.This terminates the carrier registry campaign so recurring monthly campaign fees stop; numbers under the registration can no longer send texts (receiving is unaffected). Deactivation is irreversible and the operation is idempotent.
Key parameter:
id (path, string)Response:
200 returns status = deactivated (enum: deactivated)View documentation
GET
Deactivated (terminated) registrations are hidden by default; pass
New query param:
•
View documentation
/v1/sms/registrations now supports includeDeactivated (boolean).Deactivated (terminated) registrations are hidden by default; pass
includeDeactivated=true to include them in the results.New query param:
•
includeDeactivated - true to include deactivated registrations (default: hidden)View documentation
conversions in ads metrics now includes non-Meta platforms.You can now rely on
conversions for more platforms when charting or aggregating performance (instead of always getting 0 outside Meta).Applies to:
•
GET /v1/ads/timeline (rows[].conversions)•
AdMetrics.conversionsNew platform behavior:
• Meta: events matching the campaign optimization goal
• Google: tracked conversions
• X / LinkedIn: reported website/lead conversions (added 2026-07)
View documentation
❤1
SMS carrier registration
You may now see pre-submission review and deactivation states when listing, fetching, or reusing registrations, which can affect clients that assume only the previous 3 statuses.
Updated
•
Applies to:
•
•
•
Also added to
•
•
View documentation
status now includes additional lifecycle states in registration APIs.You may now see pre-submission review and deactivation states when listing, fetching, or reusing registrations, which can affect clients that assume only the previous 3 statuses.
Updated
status enum:•
pending, approved, rejected, requested, changes_requested, deactivatedApplies to:
•
GET /v1/sms/registrations•
GET /v1/sms/registrations/{id}•
POST /v1/phone-numbers/{id}/sms/reuse-registrationAlso added to
POST /v1/sms/registrations request body:•
resubmitRequestId (resubmit an existing registration returned for changes)•
wizardValues (optional raw wizard answers; can be omitted by API integrators)View documentation
❤1
GET
This lets you proactively refresh stored tokens (the endpoint normally returns
Use
New param:
View documentation
/v1/connect/{platform}/ads now supports force to trigger a fresh OAuth flow even when an ads account is already connected.This lets you proactively refresh stored tokens (the endpoint normally returns
alreadyConnected: true based on account active state, not token liveness).Use
force=true to always receive authUrl; completing OAuth refreshes the stored token on the existing posting + ads accounts in place.New param:
force (true/false, default false)View documentation
YouTube demographics analytics now supports per-video audience breakdowns via
Pass
Use:
•
•
Response adds (video mode only):
Also: Meta city targeting docs were updated to reflect that
View documentation
videoId on GET /v1/analytics/youtube/demographics.Pass
videoId to fetch demographics for a single video (instead of the whole channel). Note: YouTube may return empty breakdowns for low-traffic videos due to signed-in view thresholds.Use:
•
videoId - YouTube video ID (scoped to the connected channel; otherwise 404)•
startDate - defaults to the video publish date (lifetime) when videoId is providedResponse adds (video mode only):
videoId, title, publishedAt.Also: Meta city targeting docs were updated to reflect that
cities[].radius has a minimum (~17 km / 10 mi). Smaller values can produce a 0-size audience and fail at launch; use customLocations for tighter radius targeting.View documentation
GET
You can raise the maximum number of Google Business Profile locations returned (default was effectively 100) up to 500 to enumerate accounts with more than 100 locations.
Use
•
Invalid values now return
View documentation
/v1/accounts/{accountId}/gmb-locations now supports a limit query parameter.You can raise the maximum number of Google Business Profile locations returned (default was effectively 100) up to 500 to enumerate accounts with more than 100 locations.
Use
limit:•
limit (integer, default 100, min 1, max 500)Invalid values now return
400 (e.g. limit out of range).View documentation
Meta campaign updates now support a lifetime spend cap via
This lets you set or remove a campaign-level spend cap without recreating the campaign.
Use:
•
•
Meta ad set updates now accept post-launch delivery settings via
Set any of:
•
•
•
•
Also added:
View documentation
platformSpecificData.spendCap on PUT /v1/ads/campaigns/{campaignId}.This lets you set or remove a campaign-level spend cap without recreating the campaign.
Use:
•
platformSpecificData.spendCap = number (sets cap)•
platformSpecificData.spendCap = null (removes cap; Meta rejects 0)Meta ad set updates now accept post-launch delivery settings via
platformSpecificData on PUT /v1/ads/ad-sets/{adSetId}.Set any of:
•
platformSpecificData.optimizationGoal•
platformSpecificData.billingEvent•
platformSpecificData.startDate, platformSpecificData.endDate•
platformSpecificData.promotedObject (e.g. pixelId, customEventType, pageId, applicationId, objectStoreUrl, customConversionId, productCatalogId, productSetId)Also added:
billingEvent (Meta only) on POST /v1/ads/create to explicitly set the ad set’s billing event (defaults to IMPRESSIONS).View documentation
Google Business reviews now include attached photos in review responses.
You can display/download reviewer-uploaded images and know how many photos are attached per review.
Added fields:
•
•
Notes:
View documentation
You can display/download reviewer-uploaded images and know how many photos are attached per review.
Added fields:
•
GET /v1/accounts/{accountId}/gmb-reviews → reviews[].photoCount, reviews[].photos[] (each item: url)•
GET /v1/inbox/reviews → data[].photos[] (Google Business only; each item: url)Notes:
photoCount counts photos only (videos not counted). For non-Google platforms, photos is always an empty array.View documentation
Google Business Profiles: you can now assign a GBP location to a different profile by reusing an existing OAuth grant (no browser re-auth).
Use
•
•
•
Returns
Phone number purchasing now supports selecting a number type.
On
Country/type discovery updates:
•
•
•
Facebook connect flow:
View documentation
Use
POST /v1/accounts/{accountId}/gmb-locations/assign with:•
profileId (target profile)•
selectedLocationId (e.g. locations/123)•
googleAccountId (optional, recommended for accounts with many locations)Returns
409 if the target profile already has a Google Business connection.Phone number purchasing now supports selecting a number type.
On
POST /v1/phone-numbers/purchase you can pass numberType: local | mobile | national | toll_free. Availability/KYC can vary by (country, type).Country/type discovery updates:
•
GET /v1/phone-numbers/countries now includes inStock and types[] (per-type monthlyCents, needsKyc, whatsappAvailable, smsAvailable, callsAvailable, inStock)•
GET /v1/phone-numbers/availability adds optional numberType•
GET /v1/phone-numbers/kyc adds optional numberTypeFacebook connect flow:
POST /v1/connect/facebook/select-page can now return 409 with code RECONNECT_ACCOUNT_MISMATCH when a force=true token-recovery re-auth lands on a different user/page than the existing connection.View documentation
New Meta Ads insights endpoints are available:
You can now run a flexible live insights query that forwards your chosen Meta Graph parameters (fields/breakdowns/filtering) and returns rows in Meta’s raw shape; use the async report flow for long ranges or large accounts.
Sync query:
Async flow:
• Submit:
• Poll:
Meta only (facebook/instagram). Invalid field/breakdown combos return
View documentation
GET /v1/ads/insights, POST /v1/ads/insights/reports, GET /v1/ads/insights/reports/{reportRunId}.You can now run a flexible live insights query that forwards your chosen Meta Graph parameters (fields/breakdowns/filtering) and returns rows in Meta’s raw shape; use the async report flow for long ranges or large accounts.
Sync query:
GET /v1/ads/insights with accountId, objectId, optional level (ad/adset/campaign/account), fields, breakdowns, filtering, datePreset or fromDate+toDate, timeIncrement, limit, after.Async flow:
• Submit:
POST /v1/ads/insights/reports (body includes accountId, objectId, optional level, fields, breakdowns, filtering, datePreset or fromDate/toDate, timeIncrement (1-90 | monthly | all_days)) → returns reportRunId• Poll:
GET /v1/ads/insights/reports/{reportRunId} with accountId, limit, after → returns status and percentCompletion; when status is Job Completed, includes data + paging.Meta only (facebook/instagram). Invalid field/breakdown combos return
400 with Meta’s error message.View documentation
❤🔥1
TikTok conversion ads created via
This makes it easier to configure
Use
•
Applies to TikTok only;
View documentation
POST /v1/ads/create now accept TikTok Events Manager event names in promotedObject.customEventType (auto-resolved to the underlying optimization_event code).This makes it easier to configure
goal=conversions without manually mapping to TikTok’s internal codes; note that ON_WEB_ORDER is now deprecated.Use
promotedObject.customEventType with one of:•
SHOPPING, ON_WEB_CART, INITIATE_ORDER, FORM, ON_WEB_REGISTER, ON_WEB_DETAILApplies to TikTok only;
promotedObject.pixelId is still required for goal=conversions.View documentation
❤1
POST
You can create TikTok ads/campaigns in a paused state and use additional geo targeting fields for TikTok.
Key changes:
•
• Geo targeting fields now support TikTok:
GET
View documentation
/v1/ads/create now supports more TikTok controls and targeting.You can create TikTok ads/campaigns in a paused state and use additional geo targeting fields for TikTok.
Key changes:
•
status now applies to Meta and TikTok: ACTIVE | PAUSED (TikTok pauses campaign > ad group > ad)• Geo targeting fields now support TikTok:
cities, regions, metrosGET
/v1/ads/targeting/search: TikTok geo searches now return mixed levels in one list (type can be country | region | city | district | metro), and geoType is not applied for TikTok results.View documentation
❤1🔥1
POST
This lets you publish a photo comment alongside the text reply. The image URL must be publicly accessible so Meta can fetch it.
New request field:
•
If
View documentation
/v1/inbox/comments/{postId} now supports attaching an image when replying on Facebook via attachmentUrl.This lets you publish a photo comment alongside the text reply. The image URL must be publicly accessible so Meta can fetch it.
New request field:
•
attachmentUrl (uri) — Facebook onlyIf
attachmentUrl is sent for non-Facebook platforms, the API now returns 400 (e.g. code PLATFORM_NOT_SUPPORTED).View documentation
Google Business batch reviews now supports server-side sorting via
This lets you fetch newest-updated reviews first (default) and stop paginating earlier when polling for recent changes.
Use
•
•
•
Also note:
Responses now clarify attribution: each
Inbox reviews (
View documentation
orderBy on POST /v1/accounts/{accountId}/gmb-reviews/batch.This lets you fetch newest-updated reviews first (default) and stop paginating earlier when polling for recent changes.
Use
orderBy:•
updateTime desc (default)•
rating•
rating descAlso note:
locationNames is now capped at maxItems: 50 per request (chunk larger sets).Responses now clarify attribution: each
locationReviews[].name is the LOCATION resource name (not the review resource name), and review includes review.name (full review resource name) plus reviewMediaItems (photos/videos).Inbox reviews (
GET /v1/inbox/reviews) now includes Google Business location attribution fields: locationId (bare id) and locationName (display name).View documentation