Skai
AdvertisingManage paid media and pull performance data with the Skai API, covering campaigns, ad groups, ads, portfolios, tags, and reports. Agents adjust spend against results the business actually recorded.
What This Integration Enables
Skai is not a connector to one ad network, it is the layer a media team already uses to hold search, social and retail media in one structure, which means an agent working here is working where the money actually moves rather than in one channel's console. That changes what the connector is for. Reading is the easy half: campaigns, ad groups, ads, budget portfolios with their cycle configuration and spend goals, the dimension tags that carry client-defined labels such as brand, region and business unit, and a reporting surface that runs synchronously for anything under 1000 rows and asynchronously for the extracts that feed a warehouse. Writing is the half that deserves a gate, because Update Campaigns and Update Portfolios are bulk operations against live spend, and the same field that carries a status change also accepts DELETED, which is how programmatic teardown is performed. Writes return a job ID rather than a result, so the honest workflow is not fire and forget: apply the batch, poll Get Job Status, and read Get Job Results when the status comes back as completed with failures, because that is the state where half the account moved and half of it did not.
Without FlowRunner
With FlowRunner
Use Case Scenarios
Performance lands in the warehouse without anyone exporting it
A nightly flow calls Get Available Columns first, since its name and group pairs are exactly what the reporting endpoints expect in fields, filters and sort, then submits the query with Run Async Analysis Report. The response carries an execution ID, and the agent polls Get Async Report Status on an interval sized to the report rather than in a tight loop, since runtimes range from seconds to an hour. Once it reports COMPLETED, Download Async Report pulls the compressed output into FlowRunner file storage and hands the next step a URL, which loads into BigQuery or Snowflake alongside the CRM revenue it needs to be joined against. Fetch Report handles the small synchronous queries that back the morning alert, since it caps at 1000 rows per page.
An external pacing rule proposes the budget change
The pacing model does not live in Skai. It lives in a planning sheet in Google Sheets or in a revenue model that reads closed business from the CRM. The agent pulls the current position with Get Portfolios and Fetch Report, computes the delta each campaign needs to hit its spend goal for the remainder of the cycle, and assembles a single proposed batch. It does not apply it. It posts it, and once approved, Update Campaigns writes budgets, bids, status or flight dates across every affected campaign in one call and returns the job ID that the reconciliation step in Scenario 3 depends on.
Tags stay in step, and teardown stays deliberate
Reports segment on dimension tags, and pacing rules read them, so tag drift quietly corrupts the numbers a CFO is shown. A weekly flow calls Get Campaign Tags, Get Ad Group Tags and Get Ad Tags, compares them against the taxonomy of record in the planning sheet or in Salesforce, and calls the matching update action for anything that has drifted, sending the complete tag list per entity since the write replaces what is stored. At quarter end the same reconciliation pattern covers teardown: Update Campaigns with the status set to DELETED removes campaigns, and Update Portfolios does the same for a pacing structure, which is one field value away from an ordinary budget edit and therefore never runs unattended.
Human-in-Loop Highlight
Update Campaigns is a bulk write against live spend, and the guardrail matters most on the day the pacing model is wrong. So the agent assembles the batch and stops before applying it, posting the arithmetic rather than a summary: "Pacing run 2026-08-04. 47 campaigns proposed for change. Daily budget total moves from 128,400 to 161,900, an increase of 33,500. Largest single change: Retail Media Q3 Brand from 4,200 to 11,800. 3 campaigns proposed for status DELETED. Apply, apply the 44 without status changes, or hold?" The paid media lead answers in Slack and the batch runs on that answer. Then the gate fires a second time, because Skai returns a job ID rather than a result, and a status of JOB_COMPLETED_WITH_FAILURES means the account is now in a state nobody designed: some campaigns carry the new budget and some carry the old one. The agent pulls the breakdown from Get Job Results, which names each rejected row with the reason it failed, and escalates it as an automation exception rather than retrying blindly against a partially applied account. Spending money at this scale is the class of decision FlowRunner's human-in-the-loop exists for, and the agent doing the arithmetic first is what makes the approval quick enough to actually happen every morning.
Agent Capabilities
24 actionsCampaigns
3- Get Campaigns Retrieves campaign records across every connected publisher account, filtered by profile, channel, status or explicit campaign IDs. Results are paged, so feed the next_page value from the response back in as Page ID to walk a large account. ID filters accept up to 500 values per call.
- Create Campaigns Creates one or more campaigns on a publisher account, covering name, budget, bids, status, flight dates and campaign type. Targeting, extensions and publisher-specific settings are not available here and are handled through Skai's bulk update file flow instead.
- Update Campaigns Edits existing campaigns by Skai campaign ID, changing budgets, bids, status or flight dates in bulk. Setting the status to DELETED removes a campaign, so this is also how programmatic teardown is performed, which is why it belongs behind an approval.
Ad Groups and Ads
4- Get Ad Groups Retrieves ad groups across connected publisher accounts, narrowed by parent campaign, profile, channel, status or explicit IDs. Results are paged with the same next_page mechanism, and ID filters accept up to 500 values per call.
- Create Ad Groups Creates one or more ad groups inside existing campaigns with name, default search bid, status, flight dates, bidding method and budget. Bidding method is inherited from the parent campaign when omitted.
- Update Ad Groups Edits existing ad groups by Skai ad group ID, changing name, bid, status, flight dates, bidding method or budget in bulk. The parent campaign ID must accompany each ad group ID.
- Create Ads Creates product ads inside existing ad groups, which is how retail media placements get provisioned programmatically. Only the PRODUCT ad type is supported by this endpoint; other creative types go through Skai's bulk file flow.
Portfolios
3- Get Portfolios Retrieves budget portfolios with their cycle configuration, spend goals and optimization settings. Portfolios are how Skai groups campaigns for shared budget pacing, so this is where any pacing workflow starts.
- Create Portfolios Creates budget portfolios with a cycle length, budget, spend goals and optional automatic optimization. Used to stand up a new pacing structure at the start of a quarter without anyone touching the Skai interface.
- Update Portfolios Edits existing portfolios by ID, typically to reset the cycle budget or adjust spend goals mid-flight. Setting the status to DELETED removes the portfolio entirely.
Tags
6- Get Campaign Tags Returns the dimension tags applied to campaigns, which is how Skai carries client-defined labels such as brand, region or business unit. Used to audit tagging coverage before a tag-segmented report is trusted.
- Update Campaign Tags Sets the dimension tags on campaigns in bulk, keeping labelling in step with a source of truth such as a planning sheet or a CRM. Tags drive segmentation in reports and pacing rules, so drift here shows up as wrong numbers rather than as an error.
- Get Ad Group Tags Returns the dimension tags applied to ad groups, which is the level most Skai bid rules operate at. Results are paged in the same way as the other list endpoints.
- Update Ad Group Tags Sets the dimension tags on ad groups in bulk so downstream segmentation and automated rules see consistent labels. Send the complete tag list per ad group, since the write replaces what is stored.
- Get Ad Tags Returns the dimension tags applied to individual ads, which is where creative-level labels such as concept or format live. Used to reconcile creative taxonomy against an asset management system.
- Update Ad Tags Sets the dimension tags on ads in bulk, keeping creative labelling aligned with the taxonomy used elsewhere. Send the complete tag list per ad, since the write replaces what is stored.
Reporting
6- Get Available Columns Lists every reportable column for an entity with its group, type and whether it can be used in reports. Call this first when building a report, because the name and group pairs it returns are exactly what the reporting actions expect in their fields, filters and sort.
- Fetch Report Runs a reporting query synchronously and returns rows inline, which suits dashboards and alerts that need an answer immediately. Results cap at 1000 rows per page, so larger extracts belong in the async path. Supplying a profile ID unlocks single-profile columns such as dimensions and custom metrics.
- Run Async Analysis Report Submits a reporting query for background execution and returns immediately, which is the right approach for anything over 1000 rows or any query that would otherwise block for minutes. The response carries an execution ID in its Location header.
- Run Saved Report Re-runs a report already saved in Skai, overriding only its date range for this execution. The saved report must have been created with a Custom date range for the override to apply, since presets such as Last 7 Days ignore it.
- Get Async Report Status Reports whether a background report execution has finished. Runtimes range from seconds to an hour depending on data volume, so poll on an interval sized to the report rather than in a tight loop.
- Download Async Report Downloads the compressed output of a completed background report into FlowRunner file storage and returns a URL that later steps can read or forward. Call it only once the status reads COMPLETED, otherwise the download fails.
Jobs
2- Get Job Status Reports the progress of a background job created by a create, update or tagging call. A status of JOB_COMPLETED_WITH_FAILURES means some rows were rejected, which is the signal that the account is half-applied and needs a person.
- Get Job Results Downloads the result file for a completed job into FlowRunner file storage and returns a URL. Choose the breakdown level to see per-row outcomes including the reason each rejected row failed, or the summary level for counts only.
Frequently Asked Questions
What can FlowRunner do with Skai?
FlowRunner agents can run Get Campaigns, Create Campaigns, and Update Campaigns in Skai, plus 21 more actions.
Does connecting Skai to FlowRunner require OAuth?
No. Skai connects to FlowRunner with an API key, no OAuth flow required.
Can Skai trigger a FlowRunner workflow automatically?
Skai doesn't currently expose triggers in FlowRunner. It connects as an action step inside workflows started by another trigger.
Start building with Skai
$100 in credits. No card required. Connect in minutes.