Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Skai Portfolios API
description: "# Overview\nSkai APIs provide programmatic access to advertising data and campaign management across Search, Social, and Retail Media publishers.\n\n## Choosing the Right API\n\n| What you want to do | API to use | Scale | Notes |\n|---|---|---|---|\n| Pull performance data, metrics, or any reportable field | [Reporting](#tag/Synchronous-Reports) or [Async Reporting](#tag/Asynchronous-Reports) | Unlimited | Primary data access API — the main Skai value-prop |\n| Discover what columns and metrics are available | [Available Columns](#operation/getAvailableColumns) | — | Full list of reportable fields per entity type |\n| Create or update campaigns, keywords, bids, budgets, targeting, and more — at scale | [Bulk Update (One File)](#tag/Bulk-Update) | Millions of rows | Supports Skai's main entity types and hundreds of attributes; all publishers except Meta |\n| Create/update a small number of campaigns or ad groups (common attributes only) | [Campaigns](#tag/Campaigns) / [Ad Groups](#tag/Ad-Groups) / [Ads](#tag/Ads) | Thousands | Limited attribute set — use Bulk Update for full control |\n| Manage Meta (Facebook/Instagram) entities | [Meta Campaigns](#tag/Meta-Campaigns) / [Meta Ad Groups](#tag/Meta-Ad-Groups) / [Meta Ads](#tag/Meta-Ads) | Thousands | Meta-specific tag and attribution management |\n| Use Skai from an AI coding assistant (Claude, Cursor, ChatGPT, Windsurf) | [MCP Integration](#tag/MCP) | — | Full reporting access via natural language |\n\nSkai APIs are RESTful and language agnostic. Authentication uses Bearer tokens over HTTPS.\n\n## What Data Can I Access?\n\nSkai aggregates advertising data across three publisher categories:\n\n| Publisher category | Examples |\n|---|---|\n| **Search** | Google Ads, Microsoft Ads, Yahoo Japan, Baidu, and others |\n| **Social (excl. Meta)** | Pinterest, Snapchat, TikTok, LinkedIn, Reddit, and others |\n| **Social (Meta)** | Facebook, Instagram |\n| **Retail Media** | Amazon Ads, Walmart, Instacart, Kroger, Target, and 100+ others |\n\n**Reportable entity types:**\n\n| Entity | Description | Publishers |\n|---|---|---|\n| `CAMPAIGN` | Campaign-level data | All |\n| `ADGROUP` | Ad group / ad set level | All |\n| `KEYWORD` | Keyword-level performance and settings | Search, Retail Media |\n| `AD` | Individual ad creatives | All |\n| `PRODUCT_ASSET` | Product-level data for shopping and retail media (called \"Products\" in the Skai UI) | Retail Media, Search Shopping |\n| `PRODUCT_TARGETING` | Product targeting entities — ASINs, categories, and product attributes | Retail Media |\n| `PORTFOLIO` | Portfolio-level budget aggregations and pacing | All |\n\n**Available metric categories per entity:**\n\n- **Performance** — Impressions, Clicks, Cost, Conversions, Revenue, ROAS, CTR, CPC, and more\n- **Attributes** — Names, statuses, budgets, bids, targeting settings, and publisher-specific fields\n- **Account-configured** — Dimensions (custom tagging labels), Conversion events (publisher, pixel, and 3rd-party), Custom Metrics (formula-based calculations your team defines)\n\nUse [Available Columns](#operation/getAvailableColumns) to see the complete column list for any entity — including full descriptions and types. A static reference is embedded in that endpoint's documentation.\n\n\n## Authentication\nThe Skai API uses the Bearer authentication scheme.\nThe first step is to generate a *refresh token* (once), which you can then exchange for a temporary *access token*, programmatically, before making an API call.\n\n> Note: The user you use to generate your *refresh token* will determine the token's permissions. API access is allowed for users with Standard role or higher.\nIt is recommended that you create and use a specialized user for your API requests.\n\n\n#### Step 1: Get a Refresh Token\nYou only need to do this once, for each API user you plan to use. \n\nLog into [this page](https://login.kenshoo.com/api/dev/refresh-token) in order to get your *refresh token* and *client ID*. The user you log in with will be the user accessing the API. \nPlease store your refresh token in a secure place. While it is not possible to recover a refresh token, you can generate a new one. The refresh token does not expire.\n\n\n#### Step 2: Generating an Access Token\nBefore making API calls, your code uses the permanent *refresh token* to generate a temporary *access token*.\n\nMake a call to /api/v1/token (as shown below) with your *refresh token* and *client ID* to generate an *access token*:\n\n curl -X POST -d \"refresh_token=<YourToken>&client_id=<Your Client Id>\" \\\n https://services.kenshoo.com/api/v1/token\n\nNote: the client_id and refresh token should be sent in the POST request body, as the refresh token is confidential and should not be sent as url param.\nthe API will reject refresh tokens sent in url params.\n\nGet token for specific agency context:\nIn case your API user is assigned to multi accounts (agencies), you should explicitly specify in the get access-token request which agency context you would like to receive the token for.\nJust add to the request mentioned above another form param called *agency_id*, and pass the relevant agency ID like this:\n \n curl -X POST -d \"refresh_token=<YourToken>&client_id=<Your Client Id>&agency_id=<Your Agency Id>\" \\\n https://services.kenshoo.com/api/v1/token\n\nToken expiration:\nPlease check for token expiration before sending another API request , you have 2 options:\n\n1. Call the API and get 401 status code indicating authentication failed.\n2. Consider the *expires_in* field of the token to issue a new access token.\n\nThe response will return a JSON containing the token and time for expiration in seconds.\nIt is recommended to use the token expiration time and reuse tokens while they are still valid, to prevent rate limit issues with generating new tokens too often.\n\n {\"email\":\"my.user@skai.io\",\"expires_in\":21600,\"access_token\":\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzaGxvbWkuY29oZW5Ac2thaS5pbyIsImV4cCI6MTcxNDU2NjgxMSwiaXNzIjoiaHR0cDovL2tlbnNob28uY29tL2xvZ2luLXNlcnZlciIsInVzZXJpZCI6MzU5NDMsImFnZW5jeUlkIjoxNSwibmFtZSI6IlNobG9taSBDb2hlbiIsInJvbGVzIjpbIktlbnNob28gQWRtaW4iLCJTa2FpIERldmVsb3BlciJdLCJhZ2VuY3lfcm9sZXMiOlt7ImFnZW5jeUlkIjoxNSwicm9sZSI6IktlbnNob28gQWRtaW4ifV0sImJpbGxpbmdJZCI6OTIwMzEsImFwaWMiOiI5MjAzMSIsIm9yaSI6ImFwaSIsImFsbG93ZWRfYXBwcyI6W119.R3tHoaecUrMGzijnF5suo9SVsffXWbWxdMv5fdB3Jx8\"}\n\n\n\n\n\n#### Step 3: Making an API call\nWith any API call to all Skai APIs, you must send a valid *access token* in the Authorization header when making requests. For example:\n\n curl -H \"Authorization: Bearer <token>\" -X POST \\\n https://services.kenshoo.com/api/v1/campaigns\n\n\n## Rate Limits\nAPI calls are limited per user, to the following:\n - 60 requests per minute\n - 2,000 requests per hour\n\nWhen you meet the limit, you receive the following 429 HTTP error: “API rate limit exceeded”.\nWhen calling any API endpoint the response headers will show the limits relevant to this user, and the number of remaining calls you can make within the current minute/hour.\n\n\n## Reporting Best Practices\n\n- **Filter for non-zero data:** For performance reports, filter to rows where a key metric (e.g., impressions > 0) to reduce report size and speed up generation.\n- **Scope structure reports:** Apply a filter like \"Last updated > X days ago\" to retrieve only recently changed entities.\n- **Use Async for large datasets:** If your report may return more than a few thousand rows, use [Async Analysis Reports](#tag/Asynchronous-Reports) and poll for results rather than the synchronous endpoint.\n\n\n## Group by and Segmentation\n### Understanding Group by and Segmentation\nWhen querying the /api/v1/reports/async/analysis and /reports endpoints, the breakdown_type parameter\ndetermines how data is structured.\n- FLAT: Returns unsegmented data without any grouping.\n- GROUP: Allows data segmentation based on specified columns (e.g., by date).\n- SEGMENT: Enables segmentation by date and an additional column, such as CampaignId.\n\n### How Group by works\nWhen using \"breakdown_type\": \"GROUP\", the group_bys parameter defines how the data is grouped. For instance:\n\"group_bys\": [ { \"name\": \"Day\", \"group\": \"TimeSegment\" } ]\n This groups data only by date, meaning campaign details won’t be included, similar to what is displayed in the grid export.\n\n| Conv. | Cost | Day |\n|-------|------|------------|\n| 2 | 100 | 09/29/2024 |\n| 3 | 200 | 09/28/2024 |\n\n### Using SEGMENT for Additional Grouping\nTo segment data by both date and another column (e.g., CampaignId), use \"breakdown_type\": \"SEGMENT\", specifying only the date column under group_bys while including the additional column in fields. Example:\n\"breakdown_type\": \"SEGMENT\",\n\"group_bys\": [ { \"name\": \"Day\", \"group\": \"TimeSegment\" } ],\n\"fields\": [ { \"name\": \"CampaignId\", \"group\": \"ATTRIBUTES\" } ]\n\nThis ensures data is segmented by day while preserving campaign details.\n\n| Campaign ID | Conv. | Cost | Day |\n|-------------|-------|------|------------|\n| 25000 | 1 | 50 | 09/29/2024 |\n| 25001 | 1 | 50 | 09/29/2024 |\n| 25000 | 2 | 150 | 09/28/2024 |\n| 25001 | 1 | 50 | 09/28/2024 |\n"
version: 1.0.0
x-logo:
url: https://grid.kenshoo.com/resources-frontend/latest/kenshoo_logo/skai-logo-devportal.svg
backgroundColor: '#FFFFFF'
altText: Skai
servers:
- url: https://services.kenshoo.com
security:
- BearerAuth: []
tags:
- name: Portfolios
description: 'Retrieve and update portfolio budgets and settings.
<dl>
<span>Publishers:</span>
<span style="color: white; padding: 8px; background-color: #4CAF50;" >Search</span>
<span style="color: white; padding: 8px; background-color: #2196F3;" >Social (excl. Meta)</span>
<span style="color: white; padding: 8px; background-color: #A29A22;" >Retail Media</span>
</dl>
'
paths:
/api/v1/portfolios:
get:
tags:
- Portfolios
summary: Get portfolios
description: 'Get portfolios API call, allows you to retrieve portfolio information. You can filter by profile ID or request specific portfolios by their IDs.
The result is a list of portfolio objects that can be paged through using the returned next_page/previous_page values.
'
operationId: getPortfolios
parameters:
- $ref: '#/components/parameters/ks'
- $ref: '#/components/parameters/pageId'
- $ref: '#/components/parameters/portfolioIds'
- $ref: '#/components/parameters/profileId'
responses:
200:
$ref: '#/components/responses/GetPortfolioEntitySuccessResponse'
400:
$ref: '#/components/responses/GetPortfolioBadRequest'
put:
tags:
- Portfolios
summary: Edit an existing portfolio
operationId: updatePortfolios
parameters:
- $ref: '#/components/parameters/ks'
requestBody:
$ref: '#/components/requestBodies/editPortfolios'
responses:
200:
$ref: '#/components/responses/EntitySuccessResponse'
400:
$ref: '#/components/responses/BadRequest'
500:
$ref: '#/components/responses/InternalServerError'
post:
tags:
- Portfolios
summary: Create a new portfolio
operationId: createPortfolios
parameters:
- $ref: '#/components/parameters/ks'
requestBody:
$ref: '#/components/requestBodies/createPortfolios'
responses:
201:
$ref: '#/components/responses/EntitySuccessResponse'
400:
$ref: '#/components/responses/BadRequest'
500:
$ref: '#/components/responses/InternalServerError'
components:
schemas:
Paging:
type: object
properties:
previous_page:
type: string
readOnly: true
next_page:
type: string
readOnly: true
ApiResponse:
type: object
properties:
status:
$ref: '#/components/schemas/ApiResponseStatus'
entities:
type: array
items:
$ref: '#/components/schemas/EntityResponse'
PortfolioDTO:
type: object
properties:
id:
type: integer
description: Skai ID of the portfolio
profile_id:
type: integer
description: Skai ID of the profile
profile_name:
type: string
description: Profile name
portfolio_name:
type: string
description: Portfolio name
description:
type: string
description: Portfolio description
default_portfolio:
type: boolean
description: Indicates if this is the default portfolio
business_cycle:
type: string
description: The cycle length of the portfolio
enum:
- Rolling
- Weekly
- Monthly
rolling_cycle_days:
type: integer
description: Number between 2 and 100
rolling_cycle_start_date:
type: string
description: The cycle start date
format: yyyy-MM-dd
weekly_cycle_start_day:
type: string
description: The weekly cycle start date
enum:
- sunday
- monday
- tuesday
- wednesday
- thursday
- friday
- saturday
monthly_cycle_start_day:
type: integer
description: The day of the month on which the monthly cycle should start
budget:
type: number
description: The portfolio's budget for the cycle
next_cycle_budget:
type: number
description: The portfolio's budget for the next cycle
first_monitor_metric:
type: string
description: The first of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
second_monitor_metric:
type: string
description: The second of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
first_monitor_value:
type: number
description: The first monitor metric's target value for the cycle
second_monitor_value:
type: number
description: The second monitor metric's target value for the cycle
rollover:
type: number
description: The amount of unspent budget from the previous cycle to add to the current cycle's budget. Available only if Allow Cycle Budget Rollover is set to TRUE
optimize_with_budget_caps:
type: boolean
description: When set to TRUE, Skai automatically optimizes to spend your budget for the cycle by updating the daily budget caps for your campaigns.
optimize_with_keyword_bids:
type: boolean
description: When set to TRUE, Skai automatically optimizes keyword-level bids to maximize clicks while meeting the spend goal for the portfolio. This process will run only if Optimize with Budget Caps is also set to TRUE and a Max Effective Bid is specified.
optimize_for:
type: string
description: The goal the portfolio optimizes for
enum:
- CLICKS
- CONVERSIONS
- REVENUE
- VISIBILITY
max_effective_bid:
type: number
description: Upper bid limit for each keyword in the portfolio
bid_strategy_target:
type: number
description: The publisher automated bid strategy target value
publisher_bid_strategy:
type: boolean
description: Indicates if the portfolio uses publisher automated bidding
signal_enhancement:
type: array
description: Defines whether the portfolio uses Signal Enhancement and syncs conversions to Google, Microsoft, or none of the publishers. Send an empty array to define as none.
items:
type: string
enum:
- Google
- Microsoft
budget_pacing:
type: string
description: Defines budget pacing during a cycle. Available only if Optimize with Budget Caps is set to TRUE.
enum:
- pace evenly
- pace early
- pace late
default: pace evenly
day_parting_monday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Mondays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_tuesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Tuesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_wednesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Wednesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_thursday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Thursdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_friday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Fridays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_saturday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Saturdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_sunday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Sundays
enum:
- 'true'
- 'false'
default: 'true'
allow_cycle_budget_rollover:
type: boolean
description: Defines whether any remaining unspent budget is automatically rolled over to the next cycle. Available only if Optimize with Budget Caps is set to TRUE
default: false
campaign_min_daily_budget:
type: number
description: Set a minimum campaign daily budget for all campaigns within this portfolio. Valid values for this setting may vary by publisher.
campaign_max_daily_budget:
type: number
description: Set a maximum campaign daily budget for all campaigns within this portfolio. Valid values for this setting may vary by publisher.
pause_campaign_setting:
type: boolean
description: Defines whether campaigns in the portfolio will automatically pause when budget issues are detected. Available only if there is no campaign_min_daily_budget or campaign_max_daily_budget set for the portfolio.
default: false
GetPortfolioApiResponse:
type: object
properties:
status:
$ref: '#/components/schemas/ApiResponseStatus'
entities:
type: array
readOnly: true
items:
$ref: '#/components/schemas/PortfolioDTO'
paging:
$ref: '#/components/schemas/Paging'
kenshoo_trace_id:
type: string
readOnly: true
error_message:
type: string
readOnly: true
ApiResponseStatus:
type: string
readOnly: true
enum:
- SUCCESS
- FAILED
- PARTIAL_SUCCESS
ErrorField:
type: object
properties:
fieldName:
type: string
description: The error field
error:
type: string
description: Error message
parameters:
type: object
additionalProperties:
type: string
description: Error additional properties
editPortfolio:
required:
- id
type: object
properties:
id:
type: integer
description: Skai ID of the portfolio
status:
type: string
description: Use ACTIVE to edit the portfolio and use DELETED to delete the portfolio
enum:
- ACTIVE
- DELETED
profile_id:
type: integer
description: Skai ID of the profile
profile_name:
type: string
description: Profile name
portfolio_name:
type: string
description: Portfolio name
description:
type: string
description: Portfolio description
default_portfolio:
type: boolean
description: Indicates if this is the default portfolio
business_cycle:
type: string
description: The cycle length of the portfolio
enum:
- Rolling
- Weekly
- Monthly
rolling_cycle_days:
type: integer
description: Number between 2 and 100
rolling_cycle_start_date:
type: string
description: The cycle start date
format: yyyy-MM-dd
weekly_cycle_start_day:
type: string
description: The weekly cycle start date
enum:
- sunday
- monday
- tuesday
- wednesday
- thursday
- friday
- saturday
monthly_cycle_start_day:
type: integer
description: The day of the month on which the monthly cycle should start
budget:
type: number
description: The portfolio's budget for the cycle
next_cycle_budget:
type: number
description: The portfolio's budget for the next cycle
first_monitor_metric:
type: string
description: The first of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
second_monitor_metric:
type: string
description: The second of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
first_monitor_value:
type: number
description: The first monitor metric's target value for the cycle
second_monitor_value:
type: number
description: The second monitor metric's target value for the cycle
rollover:
type: number
description: The amount of unspent budget from the previous cycle to add to the current cycle's budget. Available only if Allow Cycle Budget Rollover is set to TRUE
optimize_with_budget_caps:
type: boolean
description: When set to TRUE, Skai automatically optimizes to spend your budget for the cycle by updating the daily budget caps for your campaigns.
optimize_with_keyword_bids:
type: boolean
description: When set to TRUE, Skai automatically optimizes keyword-level bids to maximize clicks while meeting the spend goal for the portfolio. This process will run only if Optimize with Budget Caps is also set to TRUE and a Max Effective Bid is specified.
optimize_for:
type: string
description: The goal the portfolio optimizes for
enum:
- CLICKS
- CONVERSIONS
- REVENUE
- VISIBILITY
max_effective_bid:
type: number
description: Upper bid limit for each keyword in the portfolio
bid_strategy_target:
type: number
description: The publisher automated bid strategy target value
publisher_bid_strategy:
type: boolean
description: Indicates if the portfolio uses publisher automated bidding
signal_enhancement:
type: array
description: Defines whether the portfolio uses Signal Enhancement and syncs conversions to Google, Microsoft, or none of the publishers. Send an empty array to define as none.
items:
type: string
enum:
- Google
- Microsoft
budget_pacing:
type: string
description: Defines budget pacing during a cycle. Available only if Optimize with Budget Caps is set to TRUE.
enum:
- pace evenly
- pace early
- pace late
default: pace evenly
day_parting_monday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Mondays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_tuesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Tuesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_wednesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Wednesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_thursday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Thursdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_friday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Fridays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_saturday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Saturdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_sunday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Sundays
enum:
- 'true'
- 'false'
default: 'true'
allow_cycle_budget_rollover:
type: boolean
description: Defines whether any remaining unspent budget is automatically rolled over to the next cycle. Available only if Optimize with Budget Caps is set to TRUE
default: false
campaign_min_daily_budget:
type: number
description: Set a minimum campaign daily budget for all campaigns within this portfolio. Valid values for this setting may vary by publisher.
campaign_max_daily_budget:
type: number
description: Set a maximum campaign daily budget for all campaigns within this portfolio. Valid values for this setting may vary by publisher.
pause_campaign_setting:
type: boolean
description: Defines whether campaigns in the portfolio will automatically pause when budget issues are detected. Available only if there is no campaign_min_daily_budget or campaign_max_daily_budget set for the portfolio.
default: false
description: The properties for the updated portfolio
example:
id: '11'
status: ACTIVE
profile_name: My profile
portfolio_name: My portfolio
budget: '1000'
next_cycle_budget: '1100'
EntityResponse:
type: object
properties:
id:
type: integer
format: int64
success:
type: boolean
errors:
type: array
items:
$ref: '#/components/schemas/ErrorField'
createPortfolio:
required:
- portfolio_name
- profile_id
type: object
properties:
profile_id:
type: integer
description: Skai ID of the profile
profile_name:
type: string
description: Profile name
portfolio_name:
type: string
description: Portfolio name
description:
type: string
description: Portfolio description
default_portfolio:
type: boolean
description: Indicates if this is the default portfolio
business_cycle:
type: string
description: The cycle length of the portfolio
enum:
- Rolling
- Weekly
- Monthly
rolling_cycle_days:
type: integer
description: Number between 2 and 100
rolling_cycle_start_date:
type: string
description: The cycle start date
format: yyyy-MM-dd
weekly_cycle_start_day:
type: string
description: The weekly cycle start date
enum:
- sunday
- monday
- tuesday
- wednesday
- thursday
- friday
- saturday
monthly_cycle_start_day:
type: integer
description: The day of the month on which the monthly cycle should start
budget:
type: number
description: The portfolio's budget for the cycle
next_cycle_budget:
type: number
description: The portfolio's budget for the next cycle
first_monitor_metric:
type: string
description: The first of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
second_monitor_metric:
type: string
description: The second of two optional goals
enum:
- CLICKS
- CONVERSION
- ROI
first_monitor_value:
type: number
description: The first monitor metric's target value for the cycle
second_monitor_value:
type: number
description: The second monitor metric's target value for the cycle
rollover:
type: number
description: The amount of unspent budget from the previous cycle to add to the current cycle's budget. Available only if Allow Cycle Budget Rollover is set to TRUE
optimize_with_budget_caps:
type: boolean
description: When set to TRUE, Skai automatically optimizes to spend your budget for the cycle by updating the daily budget caps for your campaigns.
optimize_with_keyword_bids:
type: boolean
description: When set to TRUE, Skai automatically optimizes keyword-level bids to maximize clicks while meeting the spend goal for the portfolio. This process will run only if Optimize with Budget Caps is also set to TRUE and a Max Effective Bid is specified.
optimize_for:
type: string
description: The goal the portfolio optimizes for
enum:
- CLICKS
- CONVERSIONS
- REVENUE
- VISIBILITY
max_effective_bid:
type: number
description: Upper bid limit for each keyword in the portfolio
publisher_bid_strategy:
type: boolean
description: Indicates if the portfolio uses publisher automated bidding
signal_enhancement:
type: array
description: Defines whether the portfolio uses Signal Enhancement and syncs conversions to Google, Microsoft, or none of the publishers. Send an empty array to define as none.
items:
type: string
enum:
- Google
- Microsoft
budget_pacing:
type: string
description: Defines budget pacing during a cycle. Available only if Optimize with Budget Caps is set to TRUE.
enum:
- pace evenly
- pace early
- pace late
default: pace evenly
day_parting_monday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Mondays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_tuesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Tuesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_wednesday:
type: string
description: Defines whether campaigns included in the portfolio are active or paused on Wednesdays
enum:
- 'true'
- 'false'
default: 'true'
day_parting_thursd
# --- truncated at 32 KB (39 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/skai-kenshoo/refs/heads/main/openapi/skai-kenshoo-portfolios-api-openapi.yml