openapi: 3.2.0 info: title: Outbrain Amplify Promoted Links Sequences API version: '0.1' description: "This API describes the interfaces for interacting with the Outbrain Amplify product. More information about Amplify can be found on our website: http://www.outbrain.com/amplify.\n\nAt this time we are working with a select number of partners to integrate the Amplify API. To be considered for the Amplify API private beta please register for the beta plan.\n\nIf you have any questions, issues, feature requests as well as if you're interested in announcments of new features, please join our Google group:\n\nhttps://groups.google.com/forum/#!forum/outbrain-amplifyapi\n\nAPI Url\nThe base url for all API end-points is https://api.outbrain.com/amplify/v0.1/\n\nTroubleshooting\nIf you're experiencing any issues or any other difficulties, please post a new topic in our Google group: https://groups.google.com/forum/#!forum/outbrain-amplifyapi\n\nPlease attach to your post the AMPLIFY-REQUEST-ID header from the returned response.\nThis header allows us to identify your unique request and helps us to reply quicker and more efficiently.\n\nUpdates\nAug 13, 2026\nNew: Brand Logo\n\nYou can now read and set a brand logo via the API. A new logoMetadata field has been added to the Marketer entity, and to the PromotedLink entity (available via extraFields=LogoMetaData) so an individual ad can carry its own logo.\n\nFeb 1, 2026\nNew: Section Volume Control for CBS Campaigns\n\nYou can now provide feedback on individual section performance for your CBS Auto mode campaigns (tROAS, tCPA, Max Conversion). This allows you to increase or decrease traffic volume from specific sections based on your own external data, such as LTV or ROAS. A new volumeControl object has been added to the Campaign entity to manage these adjustments.\n\nJan 4, 2026\nEnhanced Publisher and Section Exclusion Experience\n\nWe are introducing a new publisher and section exclusion experience that allows advertisers to apply temporary or permanent blocks, either individually or in bulk. This update provides clearer visibility, predictable behavior, and the ability to easily undo or adjust exclusions via the API.\n\nWhy This Matters\nPublisher traffic can spike temporarily due to breaking news or viral events, attracting audiences that may not align with advertiser intent. During these periods, campaigns often generate clicks with few conversions, inflating costs.\n\nTemporary exclusions allow you to pause this inventory while the news cycle is active. The system then automatically reintroduces the inventory once traffic normalizes—avoiding the need for unnecessary permanent blocks.\n\nTechnical Implementation: New expiration Field under blockedSites\nTo enable temporary blocking, we have added a new optional field named expiration to both the blockedPublishers and blockedSections objects under blockedSites.\n\nKey Functionalities\n\n- \nAuto-Expiration: Temporary exclusions automatically expire and reintroduce inventory without alerts.\n\n- \nRe-activation: You can now update settings for sections that were previously Permanently blocked, overriding the original exclusion state.\n\n- \nInheritance: Duplicated campaigns will inherit the existing exclusion states (Temporary or Permanent) of the original campaign.\n\nImportant Notes\n\n- \nReporting: History changes will now track the distinction between permanent and temporary exclusions.\n\n- \nCSV Limitation: Exclusions uploaded via CSV files remain Permanent by default at this time (the expiration field is not yet supported in CSV uploads).\n\nAction Required\nReview your current blocking logic. If you wish to utilize temporary blocking for viral events, update your integration to populate the expiration field in your blockedPublishers and blockedSections payloads.\n\nOct 16, 2025\nUpcoming Change to Minimum Campaign Budget Effective November 3rd 2025\n\nTo help increase campaign performance and ensure new campaigns can generate results in a timely fashion, we are adjusting the minimum required budget. This change will ensure campaigns have sufficient daily spend for our optimization systems to function effectively\n\nSummary of the Change\n\n- \nWhat: The minimum daily budget for a new campaign will be increased from $20.00 to $25.00 USD.\n\n- \nEffective Date: This change will take effect on November 3rd 2025\n\n- \nScope: This change applies only to newly created campaigns. Existing campaigns with budgets under $25.00 will continue to run without any interruption or required changes.\n\nHow This Affects You\nStarting November 3rd, 2025, any API call to the POST /budgets endpoint will enforce the following rules:\n\n- \nIf type = \"DAILY\", then amount must be greater than or equal to 25.\n\n- \nIf type = \"MONTHLY\", then amount must be greater than or equal to 750.\n\n- \nIf type = \"CAMPAIGN\", then amount must be greater than or equal to 25 x number of campaign days.\n\nAdditionally:\n\n- Any API call to the PUT /budgets endpoint to update campaigns created after November 3rd, 2025, will have the same enforcement rules outlined above.\n\nImportant Note:\nDaily limits for other currencies are exposed via the GET /currencies endpoint.\n\nAction Required\nPlease review your budget and campaign creation and update logic and ensure that any new campaigns are created with a daily budget of at least $25.00. We recommend making this update in your integration before the effective date to ensure a smooth transition.\n\nJul 8, 2025\nNew Performance Report Endpoint - Marketers Report\n\nYou can now retrieve performance reporting aggregated by Marketers aggregation, using your primary account ID.\n\nTo obtain your primary account ID, use the Marketer Entity with the extraFields=Account param.\n\nDec 22, 2024\nNew Filter Added to reporting endpoints: enabledCampaignsOnly\n\nYou can now filter data to include only active campaigns by using the enabledCampaignsOnly field when using our reporting endpoints (promoted content, Periodic, publishers, sections etc).\n\n- \nCurrent Default Value: false\n\n- \nFuture Default Value: true (effective end of January 2025)\n\nPlease note that while the current default value for en" contact: name: Outbrain Developer Center url: https://developer.outbrain.com servers: - url: https://api.outbrain.com/amplify/v0.1 description: Production Server security: - OBTokenAuth: [] tags: - name: PromotedLinksSequences description: "Sequences comes in 2 formats:\n\n- \nCarousel - multi-promotedLink format that features CTA buttons, brand logo, and more. You can use Carousel to tell your brand story, showcase multiple products, and build a sequential message — with up to 10 images for consumers to swipe through.\n\n- In order to create sequences of this type your campaign’s creative format must be Carousel (see Campaign creative format)\n- A carousel must have at least 3 promoted links and up to 10 promoted links in it\n- A campaign can have only 1 carousel\n- Promoted links can’t be duplicated in the same carousel\n- All promoted links must be in the same language\n- App rating us supported only for sequences of type AppInstall\n\n- \nApp Install - gives you the ability to present your promoted link with logo, sponsor, app rating and direct redirect to google/apple store to download and install the app.\n\n- In order to create seq" paths: /promotedLinksSequences/{id}: get: operationId: getPromotedLinksSequencesId summary: Retrieve a Single PromotedLinkSequence tags: - PromotedLinksSequences parameters: - name: id in: path required: true schema: type: string description: the id of the PromotedLinksSequence example: 0022310af9cb6398828bf2abd1445aa9fe responses: '200': description: JSON representation of PromotedLinksSequence Resource content: application/json: schema: type: object example: id: 0022310af9cb6398828bf2abd1445aa9fe campaignId: 009247e650fa2b633751c9d8d21689e626 title: title enabled: true onAirStatus: onAir: false reason: CAMPAIGN_OFF_AIR cachedLogoUrl: http://image.com sponsor: Sponser promotedLinks: - id: 004a20d8a639b14703b76c7f9cfbde81f6 text: text1 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image1.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 2 approvalStatus: status: Pending isEditable: true imageType: Standard language: en - id: 00edb86a9edd703c67af97b31466188e56 text: text2 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image2.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 1 approvalStatus: status: Pending isEditable: true creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' headers: AMPLIFY-REQUEST-ID: description: Request correlation / rate-limit signal schema: type: string '400': description: Bad Request - the request could not be understood or was missing required parameters content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized - authentication failed or the user lacks permission for the requested operation content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden - access denied content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found - resource was not found content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: Too Many Requests - request exceeded rate limits; see the rate-limit-msec-left header content: application/json: schema: $ref: '#/components/schemas/Error' /campaigns/{campaignId}/promotedLinksSequences: post: operationId: createCampaignsCampaignIdPromotedLinksSequences summary: Create a PromotedLinkSequence description: "You can create a new promoted links sequence and associate it with an existing campaign.\n\nPOST a JSON hash with the following attributes:\n\n- \ntitle - Optional for carousels only\n\n- \nenabled - mandatory\n\n- \nlogoUrl - mandatory\n\n- \nsponsor - mandatory\n\n- \npromotedLinks - mandatory, See Sub Promoted Link Object\n\n- \nratingEnabled - optional for app install only, false by default" tags: - PromotedLinksSequences parameters: - name: campaignId in: path required: true schema: type: string description: The Id of the Campaign example: campaignId requestBody: required: true content: application/json: schema: type: object example: title: title enabled: true logoUrl: logoUrl sponsor: sponsor promotedLinks: - id: 00b38b4ab4c5490bf8fe707c5448d77b56 sequenceSettings: sequenceOrder: 3 - id: 00d636d8a5019132acc6edf71916da8594 sequenceSettings: sequenceOrder: 2 - id: 00ede8c0a39e447ac2247013b0445eecc9 sequenceSettings: sequenceOrder: 1 responses: '200': description: JSON representation of PromotedLinksSequence Resource content: application/json: schema: type: object example: id: 0022310af9cb6398828bf2abd1445aa9fe campaignId: 009247e650fa2b633751c9d8d21689e626 title: title enabled: true onAirStatus: onAir: false reason: CAMPAIGN_OFF_AIR cachedLogoUrl: http://image.com sponsor: Sponser promotedLinks: - id: 004a20d8a639b14703b76c7f9cfbde81f6 text: text1 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image1.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 2 approvalStatus: status: Pending isEditable: true imageType: Standard language: en - id: 00edb86a9edd703c67af97b31466188e56 text: text2 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image2.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 1 approvalStatus: status: Pending isEditable: true creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' headers: AMPLIFY-REQUEST-ID: description: Request correlation / rate-limit signal schema: type: string '400': description: Bad Request - the request could not be understood or was missing required parameters content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized - authentication failed or the user lacks permission for the requested operation content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden - access denied content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found - resource was not found content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: Too Many Requests - request exceeded rate limits; see the rate-limit-msec-left header content: application/json: schema: $ref: '#/components/schemas/Error' get: operationId: getCampaignsCampaignIdPromotedLinksSequences summary: List PromotedLinksSequences for Campaign description: "Collection of all PromotedLinksSequences for the specified Campaign.\nResults can be filtered by supplying additional query parameters.\n\nThe PromotedLinksSequences collection resource has the following attributes:\n\n- \nsequences - Array of Promoted Links Sequence.\n\n- \ncount - Number of PromotedLinksSequences returned in the sequences array included in this response.\n\n- \ntotalCount - Total number of PromotedLinksSequence regardless of 'limit' and 'offset' parameters, used for pagination." tags: - PromotedLinksSequences parameters: - name: campaignId in: path required: true schema: type: string description: The Id of the Campaign example: abf4b02153ee75f3cadc4fc128ab0419ab - name: onAir in: query required: false schema: type: boolean description: filter only on air sequences example: 'true' - name: limit in: query required: false schema: type: number description: num of PromotedLinksSequence to retrieve. default is 25. Maximum is 50 example: '200' - name: offset in: query required: false schema: type: number description: index of the first PromotedLink in the result, zero based. default is 0 example: '3' responses: '200': description: JSON representation of all PromotedLinksSequences associated with Campaign {id} content: application/json: schema: type: object example: sequences: - id: 0022310af9cb6398828bf2abd1445aa9fe campaignId: 009247e650fa2b633751c9d8d21689e626 title: title enabled: true onAirStatus: onAir: false reason: CAMPAIGN_OFF_AIR cachedLogoUrl: http://image.com sponsor: Sponser promotedLinks: - id: 004a20d8a639b14703b76c7f9cfbde81f6 text: text1 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image1.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 2 approvalStatus: status: Pending isEditable: true imageType: Standard language: en - id: 00edb86a9edd703c67af97b31466188e56 text: text2 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image2.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 1 approvalStatus: status: Pending isEditable: true creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' totalCount: 1 count: 1 '400': description: Bad Request - the request could not be understood or was missing required parameters content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized - authentication failed or the user lacks permission for the requested operation content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden - access denied content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found - resource was not found content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: Too Many Requests - request exceeded rate limits; see the rate-limit-msec-left header content: application/json: schema: $ref: '#/components/schemas/Error' /promotedLinksSequences/{promotedLinksSequenceId}: put: operationId: updatePromotedLinksSequencesPromotedLinksSequenceId summary: Update a PromotedLinkSequence description: "To update a promotedLinkSequence send a JSON with the updated value for one or more of the updatable promotedLinkSequence attributes.\n\nAll attribute values left unset in this PUT will remain unchanged.\n\nOnly the following PromotedLinkSequence properties are updatable:\n\n- \ntitle - For carousels only, Maximum length is 150 characters\n\n- \nenabled\n\n- \nlogoUrl\n\n- \nsponsor\n\n- \npromotedLinks - See Sub Promoted Link Object\n\n- \nratingEnabled - for app install only" tags: - PromotedLinksSequences parameters: - name: promotedLinksSequenceId in: path required: true schema: type: string description: The Id of the PromotedLinkSequence example: promotedLinksSequenceId requestBody: required: true content: application/json: schema: type: object example: title: new title enabled: true logoUrl: newLogoUrl sponsor: new sponsor promotedLinks: - id: 00b38b4ab4c5490bf8fe707c5448d77b56 sequenceSettings: sequenceOrder: 1 - id: 00d636d8a5019132acc6edf71916da8594 sequenceSettings: sequenceOrder: 2 - id: 00ede8c0a39e447ac2247013b0445eecc9 sequenceSettings: sequenceOrder: 3 responses: '200': description: JSON representation of PromotedLinksSequence Resource content: application/json: schema: type: object example: id: 0022310af9cb6398828bf2abd1445aa9fe campaignId: 009247e650fa2b633751c9d8d21689e626 title: title enabled: true onAirStatus: onAir: false reason: CAMPAIGN_OFF_AIR cachedLogoUrl: http://image.com sponsor: Sponser promotedLinks: - id: 004a20d8a639b14703b76c7f9cfbde81f6 text: text1 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image1.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 2 approvalStatus: status: Pending isEditable: true imageType: Standard language: en - id: 00edb86a9edd703c67af97b31466188e56 text: text2 creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' url: https://url1.com siteName: siteName sectionName: sectionName status: PENDING enabled: true cachedImageUrl: http://image2.com campaignId: 009247e650fa2b633751c9d8d21689e626 archived: false documentLanguage: EN onAirStatus: onAir: false reason: SEQUENCE_OFF_AIR baseUrl: https://baseUrl.com documentId: 00f863c5674af5c5f63415500f699a04e5 sequenceSettings: sequenceId: 0022310af9cb6398828bf2abd1445aa9fe sequenceOrder: 1 approvalStatus: status: Pending isEditable: true creationTime: '2020-09-23 05:30:43' lastModified: '2020-09-23 05:30:43' headers: AMPLIFY-REQUEST-ID: description: Request correlation / rate-limit signal schema: type: string '400': description: Bad Request - the request could not be understood or was missing required parameters content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized - authentication failed or the user lacks permission for the requested operation content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden - access denied content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found - resource was not found content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: Too Many Requests - request exceeded rate limits; see the rate-limit-msec-left header content: application/json: schema: $ref: '#/components/schemas/Error' components: schemas: Error: type: object description: Error envelope returned on 400/401/403/404/429 responses. properties: moreInfo: type: string description: Short machine-readable hint identifying the failing operation. errorMessage: type: string description: Human-readable error message. examples: - moreInfo: get-budget errorMessage: access denied securitySchemes: OBTokenAuth: type: apiKey in: header name: OB-TOKEN-V1 description: Token obtained from GET /login (HTTP Basic) or from https://my.outbrain.com/create-token. Valid for 30 days. BasicAuth: type: http scheme: basic description: HTTP Basic credentials used only on GET /login to obtain an OB-TOKEN-V1 token.