Pontiac Wiki Pontiac Wiki

API Documentation

API Documentation

  • Getting Started with Pontiac API
    • Pontiac API Overview
    • Object Hierarchy
    • Campaign vs. Line Management Inheritance
  • Bidder API Campaign Tutorial
    • Tutorial Overview
    • Authentication
    • Creating a New Advertiser
    • Uploading a Creative
    • Creating a Pixel
    • Creating a Campaign
    • Creating a Line
  • Bidder API Reporting
    • Reporting Methods
    • Report Generation
    • Scheduled Reports
    • Master Seat and SubSeat Reporting
    • Reporting Best Practices
  1. Home
  2. API Documentation

Pontiac API Overview

The Pontiac API (Application Programming Interface) allows users to interact with Pontiac programmatically and integrate Pontiac’s ad buying and reporting capabilities into external applications.

Using the API, developers can automate workflows such as:

  • Creating Advertisers, Campaigns, Lines, Creatives, and Pixels
  • Managing campaign settings and targeting
  • Retrieving reporting and performance data
  • Updating and optimizing active campaigns

API integration is intended for users or teams with development resources who want to incorporate Pontiac functionality into their own systems rather than completing every action through the Pontiac user interface.

Common use cases include:

  • Publishers: Integrate Pontiac into an existing platform to allow advertisers to extend campaigns beyond the publisher’s owned properties and access programmatic inventory.
  • Agencies: Connect proprietary planning, reporting, or insertion order systems to automate campaign creation and management.
  • Trading Desks: Build custom workflows for campaign creation, reporting, bidding, and optimization.

If you are interested in using the Pontiac API, contact your Account Manager or reach out through the Help Center for additional information and access.

API Environments

Pontiac provides both production and sandbox environments.

Production

Use the production environment for live campaign activity.

API Documentation:
https://api.pontiac.media/docs/

The API documentation provides the available endpoints, request parameters, object structures, and response schemas.

Sandbox

The sandbox environment can be used to develop and test an integration without affecting live campaigns or production spend.

You can also log in to the sandbox interface to confirm that objects created or updated through API requests are appearing as expected.

Sandbox Interface:
https://sandbox.pontiac.media

Sandbox API Documentation:
https://sandbox.pontiac.media:1070/docs/

When developing an integration, we recommend testing requests in the sandbox before moving the workflow to production.

You can use the sandbox just like the regular production environment without the risk of spending any money. You can also login to the sandbox as if it were our normal ui to make sure that your calls are going through correctly.

Sandbox Interface:
https://sandbox.pontiac.media

Sandbox API Documentation:
https://sandbox.pontiac.media:1070/docs/

When developing an integration, we recommend testing requests in the sandbox before moving the workflow to production.

Using the Examples in This Guide

The examples throughout this guide use cURL.

cURL is a command-line tool for sending HTTP requests and can be used to interact directly with Pontiac’s API endpoints.

For example:

curl -X GET \
  'https://api.pontiac.media/rtb/advertisers' \
  -H 'accept: application/json' \
  -H 'auth: YOUR_AUTH_TOKEN'

The same API requests can also be made using other HTTP clients or incorporated into applications written in languages such as Python, JavaScript, Java, or PHP.

Modern versions of Windows, macOS, and Linux support cURL from the command line, although the exact command-line environment may vary by operating system.

Authentication and Security

API requests require authentication. After successfully authenticating, use the returned authentication token for subsequent requests as demonstrated in the examples throughout this guide.

Treat API usernames, passwords, and authentication tokens as sensitive credentials.

Do not share authentication tokens publicly or submit authenticated Pontiac API requests through untrusted third-party request tools.

The following walkthrough demonstrates the process of authenticating and then creating the core objects needed to launch a Campaign through the Pontiac API.

Additional Resources

Cygwin
https://www.cygwin.com/

Tutorial for setting up unix commands for windows
https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/

Online curl tool
https://reqbin.com/curl

Object Hierarchy

Pontiac’s RTB API uses a hierarchical object structure for campaign setup.

For a standard Seat, the core hierarchy is:

Seat > Advertiser > Campaign > Line

For accounts using a Master Seat structure, the hierarchy is:

Master Seat > Sub-Seat > Advertiser > Campaign > Line

Creatives, Pixels, and Audiences are created separately and are associated with the applicable Advertiser, Campaign, or Line depending on the object type and management settings.

Master Seat

A Master Seat is the top-level account used to manage one or more Sub-Seats.

Master Seats are typically used by organizations that operate multiple advertiser environments, business units, clients, or managed accounts under a single parent account.

Hierarchy:

Master Seat > Sub-Seat

Depending on the endpoint and workflow, API requests may be made from the Master Seat while specifying the applicable Sub-Seat.

Sub-Seat

A Sub-Seat is an individual Seat managed beneath a Master Seat.

Advertisers, Campaigns, Lines, Creatives, Pixels, and other RTB objects are created within the applicable Sub-Seat.

Hierarchy:

Master Seat > Sub-Seat > Advertiser

For accounts that do not use a Master Seat structure, the Seat itself acts as the top-level account.

Advertiser

An Advertiser is created within a Seat or Sub-Seat and represents the brand or organization running the advertising activity.

Advertisers contain the Campaigns and advertiser-level resources associated with that advertiser.

Hierarchy:

Seat > Advertiser

or:

Master Seat > Sub-Seat > Advertiser

Example:

  • Seat ID: 1000
  • Advertiser ID: 5943

The advertiserId returned when the Advertiser is created is used when creating Campaigns, Lines, Creatives, Pixels, and other advertiser-level objects.

Campaign

A Campaign is created under an Advertiser.

Campaigns define the broader settings that can apply to the Lines created beneath them, including:

  • Campaign dates
  • Budget and budget type
  • Flights
  • Pacing
  • Dayparting
  • Frequency and recency
  • Targeting
  • Creative management
  • Pixel management
  • Programmatic Guaranteed settings

Hierarchy:

Advertiser > Campaign

Example:

  • Advertiser ID: 5943
  • Campaign ID: 14901

A Campaign does not bid directly on inventory. At least one Line must be created under the Campaign in order for it to deliver.

Line

A Line is created under a Campaign and is the core bidding and delivery object.

Lines define how Pontiac bids on eligible inventory, including settings such as:

  • Bid type
  • Bid price
  • Maximum bid
  • Line-level targeting
  • Inventory type
  • Budget allocation
  • Other Line-specific delivery settings

Hierarchy:

Campaign > Line

Example:

  • Campaign ID: 14901
  • Line ID: 75913

Each Line belongs to exactly one Campaign.

Creatives

Creatives are created under an Advertiser and contain the ad content that can be served by Campaigns and Lines.

Example:

  • Advertiser ID: 5943
  • Creative ID: 30336

Creatives can be associated directly with Lines or managed at the Campaign level.

When Campaign-level Creative management is enabled, Creatives associated with the Campaign are inherited by its Lines.

Pixels

Pixels are created under an Advertiser and are used for measurement, conversion tracking, and audience creation.

Example:

  • Advertiser ID: 5943
  • Pixel ID: 18887

Pixels can be associated at either the Campaign or Line level.

When Campaign-level Pixel management is enabled, Pixels associated with the Campaign are inherited by its Lines.

Audiences

Audiences are created and managed at the Seat level.

Depending on the audience type, these may include:

  • First-party audiences
  • Third-party audiences
  • Contextual audiences
  • ART audiences

Audiences can be created, updated, and managed at the applicable Seat level and then used as targeting criteria across eligible Campaigns and Lines within that Seat.

For accounts using a Master Seat structure, audiences created at the Master Seat level may also be available to associated Sub-Seats. These inherited audiences cannot be edited from the Sub-Seat. When applicable, the interface displays:

This audience cannot be edited because it belongs to the Master Seat.

Audience targeting can be applied at either the Campaign or Line level.

Flights

Flights define budget and date ranges within a Campaign.

When Flights are enabled, a Campaign can contain one or more Campaign Flights. Lines beneath the Campaign can also have corresponding Line Flights.

Example:

  • Campaign ID: 14901
  • Campaign Flight ID: 8371
  • Line ID: 75913
  • Line Flight ID: 58824

How the Objects Work Together

For a standard Seat:

Seat
├── Audiences
└── Advertiser
    ├── Creatives
    ├── Pixels
    └── Campaign
        ├── Campaign Flights
        └── Line
            └── Line Flights

For a Master Seat account:

Master Seat
├── Audiences
└── Sub-Seat
    ├── Audiences
    └── Advertiser
        ├── Creatives
        ├── Pixels
        └── Campaign
            ├── Campaign Flights
            └── Line

Audiences created at the Master Seat level are available to associated Sub-Seats for targeting, but they remain owned and managed by the Master Seat. Sub-Seats can use these audiences but cannot edit them.

Sub-Seats can also create and manage their own audiences. Audiences created within a Sub-Seat are owned by that Sub-Seat and can be edited there.

Creatives and Pixels, by contrast, are associated with an Advertiser and can then be applied at either the Campaign or Line level, depending on the applicable management settings.

Campaign vs. Line Management Inheritance

Campaigns contain one or more Lines. While the Line is the level where bidding and inventory delivery are executed, many settings can be configured at the Campaign level and applied across all Lines within that Campaign.

This allows settings that are shared by multiple Lines to be managed once at the Campaign level, while Line-specific bidding and targeting can still be configured independently.

Campaign-Level Management

When creating a Campaign, the following management settings determine whether certain configurations are controlled at the Campaign or Line level:

  • budgetManagement: Manage budgets across Lines from the Campaign.
  • creativesManagement: Manage Creative associations from the Campaign.
  • pixelsManagement: Manage Pixel associations from the Campaign.
  • autoPace: Manage pacing from the Campaign.
  • daypartsManagement: Manage daypart settings from the Campaign.
  • enableFrequency: Apply Campaign-level frequency and recency controls.

The effective configuration of a Line therefore depends on both the Line settings and the management settings enabled on its parent Campaign.

Budget Management

When Campaign-level budget management is enabled, the Campaign owns the overall budget and its Lines receive a portion of that budget based on their allocation.

Instead of assigning an independent budget to each Line, use:

budgetAllocationWeight

For example:

"budgetAllocationWeight": 100

If there is only one Line, a weight of 100 assigns it the full Campaign budget allocation.

If there are multiple Lines, their relative allocation weights determine how the Campaign budget is distributed between them. For example, if Line A has a weight of 100 and Line B has a weight of 200:

  • Line A receives 33.33% of the allocation: 100 / (100 + 200)
  • Line B receives 66.67% of the allocation: 200 / (100 + 200)

The Line’s budgetType is inherited from the parent Campaign and should not be set independently on the Line.

Budget Multiplier

Lines can also use:

budgetMultiplier

to adjust the Line’s calculated daily budget.

For example:

"budgetMultiplier": 1

A value of 1 applies no additional multiplier.

A value of 1.1 increases the Line’s calculated daily budget by 10%. For example, if the Line’s calculated daily budget is $100, a budgetMultiplier of 1.1 increases the effective daily budget to $110.

The Budget Multiplier affects how much budget the Line is allowed to spend; it does not increase the Line’s bid price.

Creative Management

Creatives belong to an Advertiser and can be associated at either the Campaign or Line level.

When:

"creativesManagement": 1

is enabled on the Campaign, Creatives associated with the Campaign are automatically available to the Lines beneath it.

The same Creative IDs therefore do not need to be associated separately with every Line.

For example, if Creative 30336 is associated with Campaign 14901, a Line created beneath that Campaign can inherit Creative 30336 without including:

"creativeIds": [
  30336
]

in the Line creation request.

If Campaign-level Creative management is not enabled, eligible Creatives must instead be associated with the applicable Lines.

This configuration is useful when different Lines within the same Campaign require different creative types or assets. For example, a Nike Campaign could contain separate Lines for CTV, Display, and Audio, with each Line associated only with the Creatives that are compatible with that inventory type.

In this setup, Creatives are managed independently at the Line level rather than applying the same Campaign-level Creatives across every Line.

Pixel Management

Pixels also belong to an Advertiser and can be associated at either the Campaign or Line level.

When:

"pixelsManagement": 1

is enabled, Pixels associated with the Campaign are applied across its Lines.

For example, Pixel 18887 associated with Campaign 14901 can automatically be associated with a Line created beneath that Campaign without including:

"pixelIds": [
  18887
]

in the Line request.

In most cases, Pixels should be associated at the Campaign level so the same conversion tracking and attribution settings apply consistently across all Lines within the Campaign.

If Campaign-level Pixel management is not enabled, Pixels can instead be associated directly with individual Lines. This may be useful when different Lines within the same Campaign require different conversion tracking or attribution setups.

Pacing Management

Pacing determines how budget is distributed throughout the applicable date range.

When Campaign-level pacing is enabled, pacing behavior is controlled by the Campaign and applied to the Lines beneath it.

Available pacing types include:

  • Custom Curve: Allows a custom pacing curve to be configured to control how budget is distributed throughout the day.
  • Even: Distributes budget evenly across the remaining Campaign duration.
  • Catch Up ASAP: Increases delivery when the Campaign is behind pace in order to catch up as quickly as possible.
  • Primetime: Applies Pontiac’s predefined primetime pacing curve to concentrate more delivery during higher-value hours.

Conditionally Required (when daypartsManagement=true):

  • pacingType: ‘even’ or ‘asap’
  • catchupAsap: Aggressive catch-up if behind pace (true/false)
  • dayPartTargetingMode: ‘user’ (user’s timezone) or ‘line’ (fixed/server timezone)

For example:

"autoPace": 1,
"daypartsManagement": 1
"pacingType": "even",
"catchupAsap": 0,
"dayPartTargetingMode": 'user' 

can be used to manage even pacing from the Campaign.

When the same pacing strategy should apply to every Line, Campaign-level pacing is typically the preferred setup.

If Campaign-level pacing management is not enabled, pacing can instead be configured independently on each Line. This may be useful when different Lines within the same Campaign require different delivery patterns.

Daypart Management

Dayparts define the days and hours when delivery is eligible.

When:

"daypartsManagement": 1

is enabled, the Campaign’s daypart configuration applies across its Lines.

Campaign dayparts should generally be used when the same delivery schedule applies to every Line in the Campaign.

For example, a Campaign targeting all hours of every day can include all 168 weekly day/hour combinations.

The Line creation endpoint still requires targets.dayParts.include to contain at least one day and hour. When Campaign-level dayparts are controlling and the Line should not introduce an additional restriction, the Line can be created with the full 24/7 schedule.

Example:

"dayParts": {
  "include": [
    {"day": "monday", "hour": 0},
    {"day": "monday", "hour": 1}
  ]
}

Continue the structure for each eligible day and hour.

Frequency and Recency

Frequency limits how often an ad can be served to the same user or identifier during a defined period. Recency establishes a minimum amount of time between impressions.

When frequency and recency are configured at the Campaign level, the limits apply across all Lines within that Campaign.

For example:

"enableFrequency": 1,
"frequencyCap": 3,
"timeFrameDays": 1,
"recency": 30

allows a user to receive up to three impressions from the Campaign within the configured time frame.

If a user receives impressions from Line 1, those impressions count toward the same Campaign-level frequency cap that also applies to Line 2 and any other Lines within the Campaign.

For example, if a user receives two impressions from Line 1, they would only be eligible to receive one additional impression from the Campaign during that time frame, regardless of which Line serves it.

This is useful when you want to control the total number of times a person is exposed to the Campaign across all of its Lines.

If frequency and recency are instead managed at the Line level, each Line maintains its own frequency and recency limits independently.

For example:

"enableFrequency": false,
"enableIpFrequencyCapping": false,
"frequencyCap": 0,
"dailyIpImpsLimit": 0,
"timeFrameDays": 1,
"recency": 0

A Line-level frequencyCap of 0 and recency of 0 mean that the Line does not apply its own additional frequency or recency restriction.

If the parent Campaign has frequency and recency configured, those Campaign-level limits still apply across all Lines within the Campaign.

Frequency Line Creation Requirement

Even when frequency and recency are managed at the Campaign level, the Line creation endpoint still requires a frequencyCap value to be included in the request.

In this case, use:

“frequencyCap”: 0

to satisfy the Line creation requirement without introducing an additional Line-level frequency cap.

Targeting

Targeting can be configured at both the Campaign and Line levels.

Campaign targeting should be used for criteria that apply to every Line in the Campaign. Line targeting can then be used to further define the inventory eligible for a specific Line.

For example, if every Line should target the United States, the country can be targeted at the Campaign level. Individual Lines can then apply additional targeting, such as:

  • Exchanges
  • Deals
  • Devices
  • Sites or Apps
  • Audiences
  • Geography
  • Content
  • Other inventory criteria

Campaign and Line targeting work together to determine the inventory eligible for the Line. Line-level targeting should therefore generally be considered an additional restriction rather than a replacement for applicable Campaign targeting.

Required Line Targeting

The Line creation endpoint requires a targets object even when most targeting is configured at the Campaign level.

At minimum, the Line must include:

  • At least one country under targets.geoCountries.include
  • At least one day and hour under targets.dayParts.include

For example:

"targets": {
  "geoCountries": {
    "include": [
      {
        "code": "US"
      }
    ]
  },
  "dayParts": {
    "include": [
      {
        "day": "monday",
        "hour": 0
      }
    ]
  }
}

When the Line should not further restrict a Campaign’s 24/7 daypart configuration, all 168 weekly hours can be included in the Line request.

Audience Targeting

Audiences are managed at the Seat or Sub-Seat level rather than under an individual Advertiser.

Audience targeting can be applied at either the Campaign or Line level.

A Campaign-level audience should be used when the audience targeting criteria apply to every Line in the Campaign. Line-level audiences can be used when different Lines require different audience strategies.

Campaign and Line audience targeting should be configured with the overall effective targeting in mind, since Campaign-level targeting applies to Lines beneath the Campaign.

Flights

When Campaign Flights are enabled, the Campaign can contain one or more Flights with specific date ranges and budget allocations.

Lines beneath the Campaign can receive corresponding Line Flights.

For example:

Campaign 14901
└── Campaign Flight 8371
    └── Line 75913
        └── Line Flight 58824

The Line Flight references the applicable Campaign Flight through its campaignFlightId.

When Campaign-level budget management is enabled, Line Flights use their budget allocation weight rather than maintaining independent Campaign-level budgets.

Campaign-Level vs. Line-Level Setup

As a general rule:

Use the Campaign level when a setting should apply to every Line.

Examples include:

  • A shared Campaign budget
  • The same Creatives across all Lines
  • The same conversion Pixels
  • A common frequency cap
  • A common daypart schedule
  • Targeting that every Line must meet

Use the Line level for settings specific to an individual bidding strategy.

Examples include:

  • Bid type and bid price
  • Inventory type
  • Deal targeting
  • Exchange targeting
  • Line-specific audiences
  • Line-specific inventory or geographic restrictions

This structure allows broad Campaign requirements to be configured once while preserving Line-level control over bidding and delivery.

Important API Behavior

Campaign-level management determines the effective configuration, but it does not mean every corresponding field can be omitted from the Line creation request.

The POST /rtb/lines endpoint performs its own validation and requires several Line fields even when the Campaign manages the effective setting.

For example, a Line created beneath a Campaign with Campaign-level management enabled may still require:

  • startDate
  • endDate
  • dailyPacing
  • catchupAsap
  • dayPartTargetingMode
  • recency
  • frequencyCap
  • targets
  • At least one targeted country
  • At least one targeted day/hour

These required values satisfy the Line creation schema and validation requirements. Campaign management settings determine which configuration ultimately controls delivery.

Tutorial Overview

This tutorial walks through the process of creating a simple campaign using the Pontiac Bidder API.

In this example, we will:

  1. Authenticate with the Pontiac API.
  2. Create an Advertiser.
  3. Upload a Creative.
  4. Create tracking for the Advertiser.
  5. Create a Campaign.
  6. Create a Line under the Campaign.
  7. Associate the Creative, tracking, targeting, and audience settings needed for delivery.
  8. Implement the applicable tracking pixel on the Advertiser’s website.

The Bidder uses the following object hierarchy: Advertiser > Campaign > Line

Creatives, Pixels, and Audiences are created separately and can then be associated with the appropriate Campaign or Line.

All RTB API requests use the following base URL: https://api.pontiac.media

Authentication

Before making requests to the Pontiac Bidder API, authenticate with Pontiac to retrieve an authorization token.

Send a POST request to: https://api.pontiac.media/auth

Request

curl -X POST "https://api.pontiac.media/auth" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "user1",
    "password": "myPassword"
  }'

Response

A successful response will include an authToken. Pass this token in the auth header for all subsequent requests.

{
  "timestamp": "2026-09-01T12:00:00Z",
  "response": {
    "authToken": "YOUR_AUTH_TOKEN"
  },
  "accountStatus": true,
  "seatId": 1000
}

The returned token must be included in the auth header for subsequent requests.

For example, to retrieve an existing Bidder Advertiser:

curl -X GET \
  -H "auth: YOUR_AUTH_TOKEN" \
  "https://api.pontiac.media/rtb/advertisers/1234"

If you switch seats during a session, the authorization token will change. Use the new token returned by the seat-switch request for subsequent API calls.

Creating a New Advertiser

Advertisers are the top level of the campaign hierarchy. Each advertiser represents a brand or company and can contain multiple campaigns.

Create an Advertiser under the current seat using: POST /rtb/advertisers

Required fields:

name: Advertiser/brand display name (must be unique within seat)
status: ‘active’ (1) or ‘inactive’ (0)
margin: Margin percentage (0.0 to 0.8, representing 0-80%)
politicalContentEnabled: Whether to allow political ads (true/false)
url: Brand website URL (must start with https://)

Request

curl -X POST "https://api.pontiac.media/rtb/advertisers" \
  -H "auth: YOUR_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "API Example",
    "status": 1,
    "margin": 0,
    "politicalContentEnabled": 0,
    "url": "https://pontiac.media/" 
}'

Response

The response returns the newly created Advertiser, including its Bidder Advertiser ID.

For example:

{
  "timestamp": "2026-09-01 16:18:19",
  "response": {
    "id": 5943,
    "name": "API Example",
    "seatId": 1000,
    "status": 1,
    "margin": 0,
    "politicalContentEnabled": 0,
    "url": "https://pontiac.media/"
  },
  "accountStatus": 1,
  "seatId": 1000
}

Save the Advertiser ID. It will be required when creating the Creative, Pixel, and Campaign.

In this example:

Advertiser ID: 5943

Pontiac Bidder UI Validation

Uploading a Creative

Creatives are created at the Advertiser level using: POST /rtb/creatives

The required fields vary depending on the Creative type. In this example, we will create a 300 × 250 Display Creative using a third-party HTML/JavaScript tag.

For a Display Creative, the full HTML or JavaScript tag is passed in the creativeData field.

Required Fields

All Creative types require:

  • advertiserId: Parent Advertiser ID.
  • name: Creative display name.
  • status: Creative status. Use 1 for active or 0 for inactive.
  • creativeType: Creative type. Supported values include Display, Video, Audio, FirstPartyVideo, and FirstPartyBanner.
  • duration: Creative duration in seconds. Use 0 for display and banner Creatives.
  • creativeSizes: Array containing at least one {width, height} object.
  • autoSizeDetection: Determines whether automatic size detection is enabled.
  • weight: Creative rotation weight from 1 to 10.

Additional fields are required depending on the Creative type:

  • Video / Audio: vastTag containing the VAST XML URL.
  • First-Party Video: clickUrl containing the click-through destination.
  • First-Party Banner: creativeData containing the Base64 encoded image.
  • Display: creativeData containing the HTML or JavaScript Creative tag.

Additional fields may also be included depending on the Creative setup, including clickUrl, MIME types, trackers, Creative flights, language, aspect ratio settings, and other Creative-level configuration.

Example Display Tag

The following HTML/JavaScript tag will be used for this example:

<script type="text/javascript" src="https://static.adzerk.net/ados.js"></script>
<script type="text/javascript">
  var ados = ados || {};
  ados.run = ados.run || [];
  ados.run.push(function() {
    ados_add_placement(11428, 1265459, "azk650936", 5)
      .setFlightCreativeId(942090911);
    ados_load();
  });
</script>
<div id="azk650936"></div>

When the tag is included in a JSON request body, quotation marks within creativeData must be escaped.

Request

curl -X 'POST' \
  'https://api.pontiac.media/rtb/creatives' \
  -H 'accept: application/json' \
  -H 'auth: YOUR_AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "seatId": 1000,
    "advertiserId": 5943,
    "name": "API test upload",
    "status": 1,
    "creativeType": "display",
    "duration": 0,
    "creativeSizes": [
      {
        "width": 300,
        "height": 250
      }
    ],
    "clickUrl": "https://pontiac.media/",
    "autoSizeDetection": true,
    "weight": 1,
    "creativeData": "<script type=\"text/javascript\" src=\"https://static.adzerk.net/ados.js\"></script> <script type=\"text/javascript\"> var ados = ados || {}; ados.run = ados.run || []; ados.run.push(function() { ados_add_placement(11428, 1265459, \"azk650936\", 5).setFlightCreativeId(942090911); ados_load(); }); </script> <div id=\"azk650936\"></div>"
  }'

Response

A successful request returns the newly created Creative with its assigned id and stored Creative configuration.

{
  "timestamp": "2026-09-01 16:38:48",
  "response": {
    "id": 30336,
    "seatId": 1000,
    "advertiserId": 5943,
    "name": "API test upload",
    "status": 1,
    "creativeType": "display",
    "mimes": [],
    "clickUrl": "https://pontiac.media/",
    "auditStatus": "pending",
    "categories": [],
    "autoSizeDetection": 0,
    "creativeSizes": [
      {
        "width": 300,
        "height": 250
      }
    ],
    "weight": 1,
    "controls": [],
    "trackers": [],
    "aspectRatioFiltering": 0,
    "hasFlights": 0,
    "dcmHosted": 0,
    "language": "en",
    "creativeData": "<script type=\"text/javascript\" src=\"https://static.adzerk.net/ados.js\"></script> <script type=\"text/javascript\"> var ados = ados || {}; ados.run = ados.run || []; ados.run.push(function() { ados_add_placement(11428, 1265459, \"azk650936\", 5).setFlightCreativeId(942090911); ados_load(); }); </script> <div id=\"azk650936\"></div>",
    "nativeData": {},
    "publisherSpecs": []
  },
  "accountStatus": 1,
  "seatId": 1000
}

From the response, save the Creative id. This ID will be used later when associating the Creative with a Campaign or Line.

In this example: Creative ID: 30336

The response also shows the Creative’s current audit status: “auditStatus”: “pending”

New Creatives are submitted for audit after creation. The audit status will update once the Creative has been reviewed.

Note that if you update any fields of the creative, this will trigger a reaudit.

Optional Creative Settings

Depending on the Creative type and setup, additional fields may include:

  • mimes: Supported MIME types (e.g., [‘video/mp4’, ‘video/webm’])
  • trackers: Additional VAST trackers [{type, url}]
  • aspectRatioFiltering: Enable aspect ratio filtering
  • hasFlights: Enable creative flights/scheduling
  • flightsDates: Flight date ranges (when hasFlights=true)
  • language: Creative language code

Pontiac Bidder UI Validation

Creating a Pixel

Pixels are created at the Advertiser level using: POST /rtb/pixels/ip-conversion-pixel

IP Conversion Pixels track user actions, such as purchases or sign-ups, after ad exposure. They can also be configured to create an RTB retargeting audience for use in Campaign and Line targeting.

In this example, we will create a conversion Pixel for the Advertiser (ID: 5943) created earlier.

Pixel Settings

The Pixel request includes the following core fields:

  • name: Pixel display name.
  • pixelType: Pixel implementation type.
  • advertiserId: Parent Advertiser ID.
  • seatId: Seat ID associated with the Pixel.

Additional tracking and audience options can also be enabled:

  • createRtbAudience: Creates an RTB retargeting audience from users captured by the Pixel.
  • daysToLiveRTB: Number of days users remain in the associated RTB audience.
  • orderIdMacro: Enables an Order ID macro.
  • orderAmountMacro: Enables an Order Amount macro.
  • clientIpMacro: Enables a Client IP macro.
  • consumerIdMacro: Enables a Consumer ID macro.
  • gdprConsentMacro: Enables a GDPR Consent macro.
  • gdprMacro: Enables a GDPR flag macro.
  • customVariableMacro: Enables a Custom Variable macro.

Request

The following example creates an IP Conversion Pixel and enables an RTB retargeting audience with a 180-day audience duration.

curl -X 'POST' \
  'https://api.pontiac.media/rtb/pixels/ip-conversion-pixel' \
  -H 'accept: application/json' \
  -H 'auth: YOUR_AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "API example",
    "pixelType": 1,
    "advertiserId": 5943,
    "seatId": 1000,
    "createRtbAudience": true,
    "orderIdMacro": true,
    "orderAmountMacro": true,
    "clientIpMacro": true,
    "consumerIdMacro": true,
    "gdprConsentMacro": true,
    "gdprMacro": true,
    "daysToLiveRTB": 180,
    "customVariableMacro": true
  }'

Response

A successful request returns the newly created Pixel and its stored configuration.

{
  "timestamp": "2026-09-01 16:55:00",
  "response": {
    "pontiacPixelId": 18887,
    "name": "API example",
    "pixelType": "2",
    "advertiserId": 5943,
    "seatId": 1000,
    "createRtbAudience": 1,
    "orderIdMacro": 1,
    "orderAmountMacro": 1,
    "clientIpMacro": 1,
    "consumerIdMacro": 1,
    "gdprConsentMacro": 1,
    "gdprMacro": 1,
    "daysToLiveRTB": 180,
    "customVariableMacro": 1,
    "piggybackPixels": []
  },
  "accountStatus": 1,
  "seatId": 1000
}

From the response, save the pontiacPixelId. This ID can be used later when associating the Pixel with the applicable Campaign or Line.

In this example: Pixel ID: 18887

Because createRtbAudience is enabled, the Pixel can also be used to build an RTB retargeting audience from captured users.

The response also includes a piggybackPixels array. If additional third-party tracking Pixels are associated with the Pontiac Pixel, they are returned in this field.

Pontiac Bidder UI Validation

Creating a Campaign

Campaigns are created under an Advertiser using: POST /rtb/campaigns

A Campaign defines the overall flight dates, budget, pacing, and management settings that apply to the Lines created beneath it.

In this example, we will create a Campaign under Advertiser ID 5943.

Required Fields

The following fields are required when creating a Campaign:

  • advertiserId: Parent Advertiser ID.
  • name: Campaign display name.
  • startDate: Campaign start date in YYYYMMDD format.
  • endDate: Campaign end date in YYYYMMDD format.
  • budget: Total Campaign budget.
  • budgetType: Budget type. Use spend for dollars or imp for impressions.
  • status: Campaign status. Use 1 for active or 0 for inactive.
  • budgetManagement: Determines whether the Campaign manages Line budgets.
  • creativesManagement: Determines whether Lines inherit Creative associations from the Campaign.
  • pixelsManagement: Determines whether Lines inherit Pixel associations from the Campaign.
  • autoPace: Enables automatic pacing adjustments.
  • daypartsManagement: Determines whether Lines inherit Campaign-level dayparting.
  • enableFrequency: Enables Campaign-level frequency capping.
  • recency: Minimum number of minutes between impressions. Use 0 to disable recency restrictions.
  • programmaticGuaranteed: Determines whether the Campaign is Programmatic Guaranteed.

Dayparting Settings

When daypartsManagement is enabled, the following fields are also required:

  • pacingType: Campaign pacing strategy. Supported values include even and asap.
  • catchupAsap: Enables aggressive catch-up pacing when the Campaign is behind pace.
  • dayPartTargetingMode: Determines which timezone is used for dayparting. Supported values include user and line.

Frequency Settings

When enableFrequency is enabled, the following fields are also required:

  • frequency: Maximum number of impressions per user.
  • timeFrameDays: Number of days over which the frequency cap is applied.

Optional Fields

Additional Campaign settings include:

  • dailyBudgetCap: Maximum daily spend. Use null when no daily cap is required.
  • code: External reference code.
  • pacingTz: Timezone used for Campaign pacing calculations.
  • pacingWeights: Custom hourly pacing weights.
  • enableFlights: Enables flight-based budget periods.

Programmatic Guaranteed Campaigns

Set:

"programmaticGuaranteed": true

for Programmatic Guaranteed Campaigns.

Programmatic Guaranteed Campaigns use specialized pacing behavior to support guaranteed delivery commitments.

Campaign Flights

Set:

"enableFlights": true

to enable Campaign flights.

Flights allow the Campaign budget to be divided into multiple budget periods within the overall Campaign dates. Each flight can have its own budget allocation.

Example Campaign Request

The following example creates an active Campaign with Campaign-level budget, Creative, Pixel, pacing, dayparting, and frequency management enabled.

The Campaign:

  • Runs from September 1 through September 30, 2026.
  • Has a total spend budget of $1,000.
  • Uses Campaign-level budget management and automatic pacing.
  • Associates Creative ID 30336.
  • Associates Pixel ID 18887.
  • Targets the United States.
  • Allows delivery during all hours of all seven days.
  • Uses the user’s timezone for dayparting.
  • Applies a frequency cap of three impressions per IP per day.
  • Requires at least 30 minutes between impressions.
  • Enables Campaign flights.
curl -X 'POST' \
  'https://api.pontiac.media/rtb/campaigns' \
  -H 'accept: application/json' \
  -H 'auth: YOUR_AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "status": 1,
    "name": "API Example Campaign",
    "seatId": 1000,
    "advertiserId": 5943,
    "startDate": 20260901,
    "endDate": 20260930,
    "budget": 1000,
    "budgetType": "spend",
    "creativeIds": [
      30336
    ],
    "pixelIds": [
      18887
    ],
    "targets": {
      "geoCountries": {
        "include": [
          {
            "code": "US"
          }
        ]
      },
      "dayParts": {
        "include": [
          {"day":"monday","hour":0},
          {"day":"monday","hour":1},
          {"day":"monday","hour":2},
          {"day":"monday","hour":3},
          {"day":"monday","hour":4},
          {"day":"monday","hour":5},
          {"day":"monday","hour":6},
          {"day":"monday","hour":7},
          {"day":"monday","hour":8},
          {"day":"monday","hour":9},
          {"day":"monday","hour":10},
          {"day":"monday","hour":11},
          {"day":"monday","hour":12},
          {"day":"monday","hour":13},
          {"day":"monday","hour":14},
          {"day":"monday","hour":15},
          {"day":"monday","hour":16},
          {"day":"monday","hour":17},
          {"day":"monday","hour":18},
          {"day":"monday","hour":19},
          {"day":"monday","hour":20},
          {"day":"monday","hour":21},
          {"day":"monday","hour":22},
          {"day":"monday","hour":23},

          {"day":"tuesday","hour":0},
          {"day":"tuesday","hour":1},
          {"day":"tuesday","hour":2},
          {"day":"tuesday","hour":3},
          {"day":"tuesday","hour":4},
          {"day":"tuesday","hour":5},
          {"day":"tuesday","hour":6},
          {"day":"tuesday","hour":7},
          {"day":"tuesday","hour":8},
          {"day":"tuesday","hour":9},
          {"day":"tuesday","hour":10},
          {"day":"tuesday","hour":11},
          {"day":"tuesday","hour":12},
          {"day":"tuesday","hour":13},
          {"day":"tuesday","hour":14},
          {"day":"tuesday","hour":15},
          {"day":"tuesday","hour":16},
          {"day":"tuesday","hour":17},
          {"day":"tuesday","hour":18},
          {"day":"tuesday","hour":19},
          {"day":"tuesday","hour":20},
          {"day":"tuesday","hour":21},
          {"day":"tuesday","hour":22},
          {"day":"tuesday","hour":23},

          {"day":"wednesday","hour":0},
          {"day":"wednesday","hour":1},
          {"day":"wednesday","hour":2},
          {"day":"wednesday","hour":3},
          {"day":"wednesday","hour":4},
          {"day":"wednesday","hour":5},
          {"day":"wednesday","hour":6},
          {"day":"wednesday","hour":7},
          {"day":"wednesday","hour":8},
          {"day":"wednesday","hour":9},
          {"day":"wednesday","hour":10},
          {"day":"wednesday","hour":11},
          {"day":"wednesday","hour":12},
          {"day":"wednesday","hour":13},
          {"day":"wednesday","hour":14},
          {"day":"wednesday","hour":15},
          {"day":"wednesday","hour":16},
          {"day":"wednesday","hour":17},
          {"day":"wednesday","hour":18},
          {"day":"wednesday","hour":19},
          {"day":"wednesday","hour":20},
          {"day":"wednesday","hour":21},
          {"day":"wednesday","hour":22},
          {"day":"wednesday","hour":23},

          {"day":"thursday","hour":0},
          {"day":"thursday","hour":1},
          {"day":"thursday","hour":2},
          {"day":"thursday","hour":3},
          {"day":"thursday","hour":4},
          {"day":"thursday","hour":5},
          {"day":"thursday","hour":6},
          {"day":"thursday","hour":7},
          {"day":"thursday","hour":8},
          {"day":"thursday","hour":9},
          {"day":"thursday","hour":10},
          {"day":"thursday","hour":11},
          {"day":"thursday","hour":12},
          {"day":"thursday","hour":13},
          {"day":"thursday","hour":14},
          {"day":"thursday","hour":15},
          {"day":"thursday","hour":16},
          {"day":"thursday","hour":17},
          {"day":"thursday","hour":18},
          {"day":"thursday","hour":19},
          {"day":"thursday","hour":20},
          {"day":"thursday","hour":21},
          {"day":"thursday","hour":22},
          {"day":"thursday","hour":23},

          {"day":"friday","hour":0},
          {"day":"friday","hour":1},
          {"day":"friday","hour":2},
          {"day":"friday","hour":3},
          {"day":"friday","hour":4},
          {"day":"friday","hour":5},
          {"day":"friday","hour":6},
          {"day":"friday","hour":7},
          {"day":"friday","hour":8},
          {"day":"friday","hour":9},
          {"day":"friday","hour":10},
          {"day":"friday","hour":11},
          {"day":"friday","hour":12},
          {"day":"friday","hour":13},
          {"day":"friday","hour":14},
          {"day":"friday","hour":15},
          {"day":"friday","hour":16},
          {"day":"friday","hour":17},
          {"day":"friday","hour":18},
          {"day":"friday","hour":19},
          {"day":"friday","hour":20},
          {"day":"friday","hour":21},
          {"day":"friday","hour":22},
          {"day":"friday","hour":23},

          {"day":"saturday","hour":0},
          {"day":"saturday","hour":1},
          {"day":"saturday","hour":2},
          {"day":"saturday","hour":3},
          {"day":"saturday","hour":4},
          {"day":"saturday","hour":5},
          {"day":"saturday","hour":6},
          {"day":"saturday","hour":7},
          {"day":"saturday","hour":8},
          {"day":"saturday","hour":9},
          {"day":"saturday","hour":10},
          {"day":"saturday","hour":11},
          {"day":"saturday","hour":12},
          {"day":"saturday","hour":13},
          {"day":"saturday","hour":14},
          {"day":"saturday","hour":15},
          {"day":"saturday","hour":16},
          {"day":"saturday","hour":17},
          {"day":"saturday","hour":18},
          {"day":"saturday","hour":19},
          {"day":"saturday","hour":20},
          {"day":"saturday","hour":21},
          {"day":"saturday","hour":22},
          {"day":"saturday","hour":23},

          {"day":"sunday","hour":0},
          {"day":"sunday","hour":1},
          {"day":"sunday","hour":2},
          {"day":"sunday","hour":3},
          {"day":"sunday","hour":4},
          {"day":"sunday","hour":5},
          {"day":"sunday","hour":6},
          {"day":"sunday","hour":7},
          {"day":"sunday","hour":8},
          {"day":"sunday","hour":9},
          {"day":"sunday","hour":10},
          {"day":"sunday","hour":11},
          {"day":"sunday","hour":12},
          {"day":"sunday","hour":13},
          {"day":"sunday","hour":14},
          {"day":"sunday","hour":15},
          {"day":"sunday","hour":16},
          {"day":"sunday","hour":17},
          {"day":"sunday","hour":18},
          {"day":"sunday","hour":19},
          {"day":"sunday","hour":20},
          {"day":"sunday","hour":21},
          {"day":"sunday","hour":22},
          {"day":"sunday","hour":23}
        ]
      }
    },
    "budgetManagement": 1,
    "creativesManagement": 1,
    "pixelsManagement": 1,
    "autoPace": 1,
    "pacingType": "even",
    "catchupAsap": 1,
    "pacingTz": "America/New_York",
    "dayPartTargetingMode": "user",
    "daypartsManagement": 1,
    "applyPacingCurveToAllDays": 1,
    "enableFrequency": 1,
    "frequencyCap": 3,
    "timeFrameDays": 1,
    "recency": 30,
    "programmaticGuaranteed": 0,
    "enableFlights": 1,
    "currency": "usd",
    "frequencyCapType": "ip"
  }'

When daypartsManagement is enabled, at least one day and hour must be included under targets.dayParts.include. Each eligible hour is entered individually. In this example, all 168 hours of the week are included, allowing delivery at any time.

Response

A successful request returns the newly created Campaign and its stored configuration.

{
  "timestamp": "2026-09-01 17:16:00",
  "response": {
    "id": 14901,
    "status": 1,
    "statusInfo": [],
    "name": "API Example Campaign",
    "seatId": 1000,
    "advertiserId": 5943,
    "startDate": 20260901,
    "endDate": 20260930,
    "budget": 1000,
    "budgetType": "spend",
    "creativeIds": [
      30336
    ],
    "pixelIds": [
      18887
    ],
    "linesCreativeIds": [],
    "pacingData": {
      "pacing": 0,
      "perfectPacing": 1.9444444444444444,
      "spend": 0
    },
    "enableFootTraffic": 0,
    "transparency": 0,
    "targets": {
      "geoCountries": {
        "include": [
          {
            "code": "US",
            "name": "United States"
          }
        ]
      },
      "dayParts": {
        "include": [
          {"day": "monday", "hour": 0},
          {"day": "monday", "hour": 1},
          {"day": "monday", "hour": 2},
          {"day": "monday", "hour": 3},
          {"day": "monday", "hour": 4},
          {"day": "monday", "hour": 5},
          {"day": "monday", "hour": 6},
          {"day": "monday", "hour": 7},
          {"day": "monday", "hour": 8},
          {"day": "monday", "hour": 9},
          {"day": "monday", "hour": 10},
          {"day": "monday", "hour": 11},
          {"day": "monday", "hour": 12},
          {"day": "monday", "hour": 13},
          {"day": "monday", "hour": 14},
          {"day": "monday", "hour": 15},
          {"day": "monday", "hour": 16},
          {"day": "monday", "hour": 17},
          {"day": "monday", "hour": 18},
          {"day": "monday", "hour": 19},
          {"day": "monday", "hour": 20},
          {"day": "monday", "hour": 21},
          {"day": "monday", "hour": 22},
          {"day": "monday", "hour": 23},

          {"day": "tuesday", "hour": 0},
          {"day": "tuesday", "hour": 1},
          {"day": "tuesday", "hour": 2},
          {"day": "tuesday", "hour": 3},
          {"day": "tuesday", "hour": 4},
          {"day": "tuesday", "hour": 5},
          {"day": "tuesday", "hour": 6},
          {"day": "tuesday", "hour": 7},
          {"day": "tuesday", "hour": 8},
          {"day": "tuesday", "hour": 9},
          {"day": "tuesday", "hour": 10},
          {"day": "tuesday", "hour": 11},
          {"day": "tuesday", "hour": 12},
          {"day": "tuesday", "hour": 13},
          {"day": "tuesday", "hour": 14},
          {"day": "tuesday", "hour": 15},
          {"day": "tuesday", "hour": 16},
          {"day": "tuesday", "hour": 17},
          {"day": "tuesday", "hour": 18},
          {"day": "tuesday", "hour": 19},
          {"day": "tuesday", "hour": 20},
          {"day": "tuesday", "hour": 21},
          {"day": "tuesday", "hour": 22},
          {"day": "tuesday", "hour": 23},

          {"day": "wednesday", "hour": 0},
          {"day": "wednesday", "hour": 1},
          {"day": "wednesday", "hour": 2},
          {"day": "wednesday", "hour": 3},
          {"day": "wednesday", "hour": 4},
          {"day": "wednesday", "hour": 5},
          {"day": "wednesday", "hour": 6},
          {"day": "wednesday", "hour": 7},
          {"day": "wednesday", "hour": 8},
          {"day": "wednesday", "hour": 9},
          {"day": "wednesday", "hour": 10},
          {"day": "wednesday", "hour": 11},
          {"day": "wednesday", "hour": 12},
          {"day": "wednesday", "hour": 13},
          {"day": "wednesday", "hour": 14},
          {"day": "wednesday", "hour": 15},
          {"day": "wednesday", "hour": 16},
          {"day": "wednesday", "hour": 17},
          {"day": "wednesday", "hour": 18},
          {"day": "wednesday", "hour": 19},
          {"day": "wednesday", "hour": 20},
          {"day": "wednesday", "hour": 21},
          {"day": "wednesday", "hour": 22},
          {"day": "wednesday", "hour": 23},

          {"day": "thursday", "hour": 0},
          {"day": "thursday", "hour": 1},
          {"day": "thursday", "hour": 2},
          {"day": "thursday", "hour": 3},
          {"day": "thursday", "hour": 4},
          {"day": "thursday", "hour": 5},
          {"day": "thursday", "hour": 6},
          {"day": "thursday", "hour": 7},
          {"day": "thursday", "hour": 8},
          {"day": "thursday", "hour": 9},
          {"day": "thursday", "hour": 10},
          {"day": "thursday", "hour": 11},
          {"day": "thursday", "hour": 12},
          {"day": "thursday", "hour": 13},
          {"day": "thursday", "hour": 14},
          {"day": "thursday", "hour": 15},
          {"day": "thursday", "hour": 16},
          {"day": "thursday", "hour": 17},
          {"day": "thursday", "hour": 18},
          {"day": "thursday", "hour": 19},
          {"day": "thursday", "hour": 20},
          {"day": "thursday", "hour": 21},
          {"day": "thursday", "hour": 22},
          {"day": "thursday", "hour": 23},

          {"day": "friday", "hour": 0},
          {"day": "friday", "hour": 1},
          {"day": "friday", "hour": 2},
          {"day": "friday", "hour": 3},
          {"day": "friday", "hour": 4},
          {"day": "friday", "hour": 5},
          {"day": "friday", "hour": 6},
          {"day": "friday", "hour": 7},
          {"day": "friday", "hour": 8},
          {"day": "friday", "hour": 9},
          {"day": "friday", "hour": 10},
          {"day": "friday", "hour": 11},
          {"day": "friday", "hour": 12},
          {"day": "friday", "hour": 13},
          {"day": "friday", "hour": 14},
          {"day": "friday", "hour": 15},
          {"day": "friday", "hour": 16},
          {"day": "friday", "hour": 17},
          {"day": "friday", "hour": 18},
          {"day": "friday", "hour": 19},
          {"day": "friday", "hour": 20},
          {"day": "friday", "hour": 21},
          {"day": "friday", "hour": 22},
          {"day": "friday", "hour": 23},

          {"day": "saturday", "hour": 0},
          {"day": "saturday", "hour": 1},
          {"day": "saturday", "hour": 2},
          {"day": "saturday", "hour": 3},
          {"day": "saturday", "hour": 4},
          {"day": "saturday", "hour": 5},
          {"day": "saturday", "hour": 6},
          {"day": "saturday", "hour": 7},
          {"day": "saturday", "hour": 8},
          {"day": "saturday", "hour": 9},
          {"day": "saturday", "hour": 10},
          {"day": "saturday", "hour": 11},
          {"day": "saturday", "hour": 12},
          {"day": "saturday", "hour": 13},
          {"day": "saturday", "hour": 14},
          {"day": "saturday", "hour": 15},
          {"day": "saturday", "hour": 16},
          {"day": "saturday", "hour": 17},
          {"day": "saturday", "hour": 18},
          {"day": "saturday", "hour": 19},
          {"day": "saturday", "hour": 20},
          {"day": "saturday", "hour": 21},
          {"day": "saturday", "hour": 22},
          {"day": "saturday", "hour": 23},

          {"day": "sunday", "hour": 0},
          {"day": "sunday", "hour": 1},
          {"day": "sunday", "hour": 2},
          {"day": "sunday", "hour": 3},
          {"day": "sunday", "hour": 4},
          {"day": "sunday", "hour": 5},
          {"day": "sunday", "hour": 6},
          {"day": "sunday", "hour": 7},
          {"day": "sunday", "hour": 8},
          {"day": "sunday", "hour": 9},
          {"day": "sunday", "hour": 10},
          {"day": "sunday", "hour": 11},
          {"day": "sunday", "hour": 12},
          {"day": "sunday", "hour": 13},
          {"day": "sunday", "hour": 14},
          {"day": "sunday", "hour": 15},
          {"day": "sunday", "hour": 16},
          {"day": "sunday", "hour": 17},
          {"day": "sunday", "hour": 18},
          {"day": "sunday", "hour": 19},
          {"day": "sunday", "hour": 20},
          {"day": "sunday", "hour": 21},
          {"day": "sunday", "hour": 22},
          {"day": "sunday", "hour": 23}
        ]
      }
    },
    "budgetManagement": 1,
    "creativesManagement": 1,
    "pixelsManagement": 1,
    "autoPace": 1,
    "pacingType": "even",
    "catchupAsap": 1,
    "pacingTz": "America/New_York",
    "dayPartTargetingMode": "user",
    "daypartsManagement": 1,
    "applyPacingCurveToAllDays": 1,
    "enableFrequency": 1,
    "frequencyCap": 3,
    "frequency": 3,
    "timeFrameDays": 1,
    "recency": 30,
    "programmaticGuaranteed": 0,
    "flights": [
      {
        "id": 8371,
        "startDate": 20260901,
        "endDate": 20260930,
        "budget": 1000,
        "pacing": 0,
        "perfectPacing": 1.944,
        "relativePacing": 0,
        "rolloverBudget": 0,
        "status": 1,
        "impressions": 0,
        "revenue": 0,
        "current": 1,
        "pendingRollover": 0,
        "rolloverDone": 0
      }
    ],
    "enableFlights": 1,
    "currency": "usd",
    "frequencyCapType": "ip"
  },
  "accountStatus": 1,
  "seatId": 1000
}

The response confirms that the Campaign was created successfully with:

  • Campaign ID: 14901
  • Creative ID: 30336
  • Pixel ID: 18887
  • Flight ID: 8371

The full 24/7 daypart schedule was also stored under targets.dayParts.include, confirming that each eligible day and hour is represented individually. Because enableFlights is enabled, an initial flight was automatically created covering the full Campaign date range and Campaign budget.

Save the Campaign ID, as it will be required when creating Lines beneath the Campaign.

Because creativesManagement and pixelsManagement are enabled, Lines created under this Campaign can inherit these Campaign level associations.

Pontiac Bidder UI Validation

Campaign Setup

Pacing & Dayparts

Frequency & Recency

Targeting, Creatives, Audiences, & Pixels

Creating a Line

Lines are created under a Campaign using: POST /rtb/lines

The Line is the level where bidding and inventory delivery are executed. Every Campaign must have at least one Line in order to deliver impressions.

In this example, we will create a Line under:

  • Advertiser ID: 5943
  • Campaign ID: 14901
  • Seat ID: 1000

Because the example Campaign was configured to manage budgets, Creatives, Pixels, pacing/dayparts, and frequency settings, the Line inherits those applicable Campaign-level settings. However, some corresponding fields are still required in the Line creation request for validation. These fields can be populated without creating additional Line-level restrictions.

Required Fields

The following fields are required when creating a Line:

  • advertiserId: Parent Advertiser ID.
  • campaignId: Parent Campaign ID.
  • name: Line display name.
  • status: Line status. Use 1 for active or 0 for inactive.
  • startDate: Line start date in YYYYMMDD format.
  • endDate: Line end date in YYYYMMDD format.
  • bidPrice: CPM bid price in dollars.
  • bidType: Bidding method. Supported values include:
    • basic: Fixed CPM bid.
    • bid-floor: Bid based on the applicable floor price.
    • advanced: Supports more granular or Deal-specific bidding.
  • recency: Minimum number of minutes between impressions. Supported values are 0, 1, 2, 5, 15, 30, 60, and 360.
  • dailyPacing: Line pacing type. Supported values include even, asap, and custom.
  • catchupAsap: Enables aggressive catch-up pacing when behind.
  • dayPartTargetingMode: Determines the timezone used for dayparting. Supported values include user and line.

budgetType is inherited from the parent Campaign and should not be included in the Line request.

Campaign-Managed Settings

The parent Campaign in this example has Campaign-level management enabled for:

  • Budget
  • Creatives
  • Pixels
  • Pacing and dayparts
  • Frequency and recency

As a result, the Line does not need to explicitly associate Creative ID 30336 or Pixel ID 18887. These associations are inherited from the parent Campaign.

Because Campaign budget management is enabled, the Line uses budgetAllocationWeight rather than setting an independent Line budget.

Some pacing and frequency fields must still be populated in the POST request to satisfy Line validation. A value of 0 is used for Line-level frequency and recency so that the Campaign-level restrictions remain controlling.

Budget Allocation

When budgetManagement is enabled on the parent Campaign, use:

budgetAllocationWeight

to assign budget weight to each Line.

In this example, there is only one Line, so a weight of 100 is used:

"budgetAllocationWeight": 100

The Line also uses:

"budgetMultiplier": 1

A multiplier of 1 means no additional daily budget multiplier is applied.

Bid Settings

This example uses Bid at Floor bidding with a maximum configured bid value of $5.11 CPM.

"bidPrice": 5.11,
"bidType": "bid-floor",
"maxBid": 5.11

The Line will use floor-based bidding while limiting the configured bid to $5.11 CPM.

Targeting Requirements

The Line endpoint requires a targets object.

At least one country must be included under:

targets.geoCountries.include

In addition, targets.dayParts.include must contain at least one eligible day and hour.

Because this example Campaign allows delivery 24 hours per day, seven days per week, the Line includes all 168 hours. This satisfies Line validation without introducing a more restrictive Line-level daypart schedule.

Frequency Validation

The Line endpoint also requires a frequencyCap value even when frequency is managed at the Campaign level.

For this example, Line-level frequency is disabled using:

"enableFrequency": false,
"enableIpFrequencyCapping": false,
"frequencyCap": 0,
"dailyIpImpsLimit": 0,
"timeFrameDays": 1,
"frequencyCapType": "ip"

The Line-level recency is also set to 0.

This leaves Line-level frequency and recency unrestricted while allowing the Campaign-level settings to remain controlling.

Example Request

curl -X 'POST' \
  'https://api.pontiac.media/rtb/lines' \
  -H 'accept: application/json' \
  -H 'auth: YOUR_AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "advertiserId": 5943,
    "campaignId": 14901,
    "seatId": 1000,
    "name": "API Example Line",
    "status": 1,
    "startDate": 20260901,
    "endDate": 20260930,
    "bidPrice": 5.11,
    "bidType": "bid-floor",
    "maxBid": 5.11,
    "recency": 0,
    "dailyPacing": "even",
    "catchupAsap": true,
    "dayPartTargetingMode": "user",
    "budgetAllocationWeight": 100,
    "budgetMultiplier": 1,
    "inventoryType": "combined",
    "enableFrequency": false,
    "enableIpFrequencyCapping": false,
    "frequencyCap": 0,
    "dailyIpImpsLimit": 0,
    "timeFrameDays": 1,
    "frequencyCapType": "ip",
    "targets": {
      "geoCountries": {
        "include": [
          {
            "code": "US"
          }
        ]
      },
      "dayParts": {
        "include": [
          {"day":"monday","hour":0},
          {"day":"monday","hour":1},
          {"day":"monday","hour":2},
          {"day":"monday","hour":3},
          {"day":"monday","hour":4},
          {"day":"monday","hour":5},
          {"day":"monday","hour":6},
          {"day":"monday","hour":7},
          {"day":"monday","hour":8},
          {"day":"monday","hour":9},
          {"day":"monday","hour":10},
          {"day":"monday","hour":11},
          {"day":"monday","hour":12},
          {"day":"monday","hour":13},
          {"day":"monday","hour":14},
          {"day":"monday","hour":15},
          {"day":"monday","hour":16},
          {"day":"monday","hour":17},
          {"day":"monday","hour":18},
          {"day":"monday","hour":19},
          {"day":"monday","hour":20},
          {"day":"monday","hour":21},
          {"day":"monday","hour":22},
          {"day":"monday","hour":23},

          {"day":"tuesday","hour":0},
          {"day":"tuesday","hour":1},
          {"day":"tuesday","hour":2},
          {"day":"tuesday","hour":3},
          {"day":"tuesday","hour":4},
          {"day":"tuesday","hour":5},
          {"day":"tuesday","hour":6},
          {"day":"tuesday","hour":7},
          {"day":"tuesday","hour":8},
          {"day":"tuesday","hour":9},
          {"day":"tuesday","hour":10},
          {"day":"tuesday","hour":11},
          {"day":"tuesday","hour":12},
          {"day":"tuesday","hour":13},
          {"day":"tuesday","hour":14},
          {"day":"tuesday","hour":15},
          {"day":"tuesday","hour":16},
          {"day":"tuesday","hour":17},
          {"day":"tuesday","hour":18},
          {"day":"tuesday","hour":19},
          {"day":"tuesday","hour":20},
          {"day":"tuesday","hour":21},
          {"day":"tuesday","hour":22},
          {"day":"tuesday","hour":23},

          {"day":"wednesday","hour":0},
          {"day":"wednesday","hour":1},
          {"day":"wednesday","hour":2},
          {"day":"wednesday","hour":3},
          {"day":"wednesday","hour":4},
          {"day":"wednesday","hour":5},
          {"day":"wednesday","hour":6},
          {"day":"wednesday","hour":7},
          {"day":"wednesday","hour":8},
          {"day":"wednesday","hour":9},
          {"day":"wednesday","hour":10},
          {"day":"wednesday","hour":11},
          {"day":"wednesday","hour":12},
          {"day":"wednesday","hour":13},
          {"day":"wednesday","hour":14},
          {"day":"wednesday","hour":15},
          {"day":"wednesday","hour":16},
          {"day":"wednesday","hour":17},
          {"day":"wednesday","hour":18},
          {"day":"wednesday","hour":19},
          {"day":"wednesday","hour":20},
          {"day":"wednesday","hour":21},
          {"day":"wednesday","hour":22},
          {"day":"wednesday","hour":23},

          {"day":"thursday","hour":0},
          {"day":"thursday","hour":1},
          {"day":"thursday","hour":2},
          {"day":"thursday","hour":3},
          {"day":"thursday","hour":4},
          {"day":"thursday","hour":5},
          {"day":"thursday","hour":6},
          {"day":"thursday","hour":7},
          {"day":"thursday","hour":8},
          {"day":"thursday","hour":9},
          {"day":"thursday","hour":10},
          {"day":"thursday","hour":11},
          {"day":"thursday","hour":12},
          {"day":"thursday","hour":13},
          {"day":"thursday","hour":14},
          {"day":"thursday","hour":15},
          {"day":"thursday","hour":16},
          {"day":"thursday","hour":17},
          {"day":"thursday","hour":18},
          {"day":"thursday","hour":19},
          {"day":"thursday","hour":20},
          {"day":"thursday","hour":21},
          {"day":"thursday","hour":22},
          {"day":"thursday","hour":23},

          {"day":"friday","hour":0},
          {"day":"friday","hour":1},
          {"day":"friday","hour":2},
          {"day":"friday","hour":3},
          {"day":"friday","hour":4},
          {"day":"friday","hour":5},
          {"day":"friday","hour":6},
          {"day":"friday","hour":7},
          {"day":"friday","hour":8},
          {"day":"friday","hour":9},
          {"day":"friday","hour":10},
          {"day":"friday","hour":11},
          {"day":"friday","hour":12},
          {"day":"friday","hour":13},
          {"day":"friday","hour":14},
          {"day":"friday","hour":15},
          {"day":"friday","hour":16},
          {"day":"friday","hour":17},
          {"day":"friday","hour":18},
          {"day":"friday","hour":19},
          {"day":"friday","hour":20},
          {"day":"friday","hour":21},
          {"day":"friday","hour":22},
          {"day":"friday","hour":23},

          {"day":"saturday","hour":0},
          {"day":"saturday","hour":1},
          {"day":"saturday","hour":2},
          {"day":"saturday","hour":3},
          {"day":"saturday","hour":4},
          {"day":"saturday","hour":5},
          {"day":"saturday","hour":6},
          {"day":"saturday","hour":7},
          {"day":"saturday","hour":8},
          {"day":"saturday","hour":9},
          {"day":"saturday","hour":10},
          {"day":"saturday","hour":11},
          {"day":"saturday","hour":12},
          {"day":"saturday","hour":13},
          {"day":"saturday","hour":14},
          {"day":"saturday","hour":15},
          {"day":"saturday","hour":16},
          {"day":"saturday","hour":17},
          {"day":"saturday","hour":18},
          {"day":"saturday","hour":19},
          {"day":"saturday","hour":20},
          {"day":"saturday","hour":21},
          {"day":"saturday","hour":22},
          {"day":"saturday","hour":23},

          {"day":"sunday","hour":0},
          {"day":"sunday","hour":1},
          {"day":"sunday","hour":2},
          {"day":"sunday","hour":3},
          {"day":"sunday","hour":4},
          {"day":"sunday","hour":5},
          {"day":"sunday","hour":6},
          {"day":"sunday","hour":7},
          {"day":"sunday","hour":8},
          {"day":"sunday","hour":9},
          {"day":"sunday","hour":10},
          {"day":"sunday","hour":11},
          {"day":"sunday","hour":12},
          {"day":"sunday","hour":13},
          {"day":"sunday","hour":14},
          {"day":"sunday","hour":15},
          {"day":"sunday","hour":16},
          {"day":"sunday","hour":17},
          {"day":"sunday","hour":18},
          {"day":"sunday","hour":19},
          {"day":"sunday","hour":20},
          {"day":"sunday","hour":21},
          {"day":"sunday","hour":22},
          {"day":"sunday","hour":23}
        ]
      }
    },
    "currency": "usd"
  }'

Response

A successful request returns the newly created Line and its stored configuration.

The response for this example returned:

{
  "timestamp": "2026-09-01 17:47:29",
  "response": {
    "id": 75913,
    "advertiserId": 5943,
    "campaignId": 14901,
    "seatId": 1000,
    "name": "API Example Line",
    "status": 1,
    "statusInfo": [],
    "startDate": 20260901,
    "endDate": 20260930,
    "deployDate": "2026-09-01 12:47:29",
    "budgetType": "spend",
    "budget": 0,
    "bidPrice": 5.11,
    "averageBidPrice": 5.11,
    "inventoryType": "combined",
    "creativeIds": [
      30336
    ],
    "pixelIds": [
      18887
    ],
    "targets": {
      "geoCountries": {
        "include": [
          {
            "code": "US",
            "name": "United States"
          }
        ]
      },
      "dayParts": {
        "include": [
          "...all 168 configured day/hour combinations..."
        ]
      }
    },
    "dailyPacing": "even",
    "catchupAsap": 1,
    "dayPartTargetingMode": "user",
    "applyPacingCurveToAllDays": 0,
    "enableIpFrequencyCapping": 0,
    "enableFrequency": 0,
    "dailyIpImpsLimit": 0,
    "frequencyCap": 0,
    "timeFrameDays": 1,
    "budgetMultiplier": 1,
    "rtbMargin": 0,
    "enableFootTraffic": 0,
    "budgetAllocationWeight": 100,
    "dailyBudget": 0,
    "recency": 0,
    "bidType": "bid-floor",
    "flights": [
      {
        "id": 58824,
        "lineId": 75913,
        "campaignFlightId": 8371,
        "startDate": 20260901,
        "endDate": 20260930,
        "budget": 0,
        "budgetAllocationWeight": 100,
        "budgetMultiplier": 1,
        "status": 1,
        "dailyBudget": 0
      }
    ],
    "currency": "usd",
    "advancedBids": [],
    "indexUseCuratedDeal": 0,
    "xandrUseCuratedDeal": 0,
    "frequencyCapType": "ip"
  },
  "accountStatus": 1,
  "seatId": 1000
}

Save the Line id returned in the response.

Line ID: 75913

The response also confirms several Campaign inheritance behaviors.

Creative and Pixel Inheritance

Creative ID 30336 and Pixel ID 18887 were not explicitly included in the Line request but were automatically associated with the created Line because Creative and Pixel management are enabled on the parent Campaign.

Budget Inheritance

The Line inherited:

"budgetType": "spend"

from the parent Campaign.

Because Campaign budget management is enabled, the Line’s independent budget is returned as 0. Instead, the Line uses:

"budgetAllocationWeight": 100

to determine its share of the Campaign-managed budget.

Line Flight

A Line flight was also automatically created:

Line Flight ID: 58824

The Line flight is linked to:

Campaign Flight ID: 8371

and uses the same date range as the Campaign flight.

Frequency and Recency

The Line was created with:

"enableFrequency": 0,
"frequencyCap": 0,
"recency": 0

This leaves Line-level frequency and recency unrestricted while the Campaign-level frequency and recency settings remain controlling.

Targeting

The Line endpoint requires both country and daypart targeting to be populated during creation.

This example targets:

  • Country: United States
  • Dayparts: All 168 hours of the week

Using the complete 24/7 schedule ensures that the Line itself does not further restrict the Campaign-level daypart schedule.

Created Objects

At the end of this example, the setup includes:

  • Advertiser ID: 5943
  • Creative ID: 30336
  • Pixel ID: 18887
  • Campaign ID: 14901
  • Campaign Flight ID: 8371
  • Line ID: 75913
  • Line Flight ID: 58824

Pontiac Bidder UI Validation

Line Creation & Setup

Targeting, Creatives, Audiences, & Pixels

Bidder API Reporting

Pontiac’s API can be used to retrieve performance data for Advertisers, Campaigns, Lines, Creatives, and other campaign dimensions.

The appropriate reporting method depends on whether you need a quick performance view for existing objects or a more detailed report with specific metrics, dimensions, and date ranges.

Reporting Methods

There are two primary approaches to reporting:

  • RTB Object Reporting: Retrieve performance metrics alongside Advertisers, Campaigns, Lines, and other RTB objects.
  • Custom Reports: Generate a report using selected dimensions, metrics, date ranges, and reporting intervals.

Scheduled reporting can also be used when the same report needs to be generated and delivered on a recurring basis.

RTB Object Reporting

RTB object endpoints can be used to retrieve object information together with performance metrics.

This is useful when an application needs to display or regularly retrieve performance for objects such as:

  • Advertisers
  • Campaigns
  • Lines

Reporting parameters can be added to the applicable RTB endpoint to request metrics.

For example:

GET /rtb/advertisers?interval=1&metrics=true

The metrics=true parameter tells the API to include performance metrics with the returned objects.

The applicable interval determines the reporting period used for those metrics.

This approach is useful for dashboards, account management tools, and integrations that need performance data together with the underlying Pontiac objects.

For more granular reporting or reporting across a specific historical date range, use Custom Reports.

Custom Reports

Custom Reports allow you to define the structure of the report by selecting:

  • Date range
  • Reporting interval
  • Dimensions
  • Metrics
  • Applicable Advertisers, Campaigns, Lines, or other filters

A Custom Report can be used when the predefined RTB object metrics do not provide the level of detail required.

For example, a report could be configured to return performance broken out by:

  • Date
  • Advertiser
  • Campaign
  • Line
  • Creative

with metrics such as:

  • Impressions
  • Clicks
  • Spend
  • Conversions
  • Post-Click Conversions
  • Post-View Conversions
  • Video or Audio events, where applicable

The complete list of supported dimensions and metrics is available in the API endpoint documentation.

Dimensions

Dimensions determine how report data is grouped.

For example, selecting:

Date
Line
Creative

produces reporting broken out by each unique combination of Date, Line, and Creative.

Adding more dimensions increases the granularity of the report and may significantly increase the number of returned rows.

Common dimensions may include:

  • Date
  • Hour
  • Advertiser
  • Campaign
  • Line
  • Creative
  • Exchange
  • Deal
  • Geography
  • Device
  • Site or App
  • Audience or Segment
  • Other inventory and content dimensions

Only include dimensions that are required for the intended analysis.

Metrics

Metrics are the numerical performance values returned in the report.

Common metrics include:

  • Impressions
  • Clicks
  • CTR
  • Spend
  • Conversions
  • Post-Click Conversions
  • Post-View Conversions
  • Video Starts
  • Video Quartiles
  • Video Completions
  • Audio events
  • Other supported performance metrics

Metric availability can depend on the selected dimensions, inventory type, and report type.

Refer to the API endpoint documentation for the current list of available metrics.

Reporting Interval

The reporting interval determines the time granularity of the results.

For example, a report may return:

  • Hourly data
  • Daily data
  • Aggregated data for the requested period

Use hourly reporting when performance needs to be analyzed within individual days.

Use daily reporting when analyzing performance over multiple days or longer Campaign periods.

The reporting interval is separate from the overall date range. For example, a report covering September 1 through September 30 with a daily interval returns performance broken out by each day in that date range.

Date Ranges

When using reports that support a defined date range, specify the applicable start and end dates for the period you want to analyze.

Historical reporting should be requested using the applicable reporting or Custom Report endpoint rather than relying only on a relative reporting interval such as “yesterday.”

This is especially important for integrations that need to backfill data if a scheduled API pull is missed.

For example, if an integration normally retrieves yesterday’s Creative performance each morning but fails to run, a Custom Report can be used to retrieve the missing historical date.

Time Zones

Time zone selection is important when comparing API reporting with data displayed in the Pontiac interface or with reports generated by another system.

Reporting dates and hours should always be interpreted using the timezone applicable to the report.

When reporting is displayed in a selected timezone, hourly data is converted into that timezone before it is presented.

Integrations that store daily or hourly reporting should keep the report timezone consistent across requests to avoid assigning activity to different dates or hours.

This is particularly important when:

  • Comparing API results with Pontiac interface reporting
  • Combining reports generated in different time zones
  • Running scheduled reports
  • Aggregating hourly data into daily totals

Report Generation

Some reports are generated asynchronously rather than returned immediately with the initial request.

When a report is submitted, the API may first return information about the report configuration and its current status.

The integration should then use the applicable report endpoint to check the report status and retrieve the completed results.

Do not assume that a successful report submission means the report data is immediately available.

Scheduled Reports

Scheduled Reports can be used when the same reporting configuration needs to run repeatedly.

This can be useful for integrations that need recurring data exports for:

  • Daily performance reporting
  • Client dashboards
  • Internal analytics
  • Data warehouse ingestion
  • Campaign monitoring

When configuring scheduled reporting, pay particular attention to:

  • Reporting interval
  • Date range or relative reporting period
  • Timezone
  • Dimensions
  • Metrics
  • Delivery schedule

For API integrations that require greater control over when data is retrieved, the application can also run its own scheduled API process rather than relying on a Pontiac Scheduled Report.

Master Seat and SubSeat Reporting

Master Seat credentials can be used to retrieve Line-level performance across associated Sub-Seats.

For example:

GET /rtb/metrics/line?sub-seats-only=true

Using sub-seats-only=true with Master Seat credentials returns Line-level metrics for the Master Seat’s associated Sub-Seats.

Because Lines belong to Campaigns within each Sub-Seat, the returned data can be used to report performance by Sub-Seat, Campaign, and Line without switching the authenticated session into each Sub-Seat individually.

This is useful for Master Seat integrations that need to aggregate reporting across multiple Sub-Seats from a single authenticated session.

For example, a Master Seat reporting workflow can:

  1. Authenticate using the Master Seat credentials.
  2. Request:
/rtb/metrics/line?sub-seats-only=true
  1. Use the returned Seat, Campaign, and Line identifiers to separate or aggregate performance by Sub-Seat.

This approach is recommended for cross-Sub-Seat reporting when Line-level metrics provide the required level of detail.

Reporting Best Practices

When building a reporting integration:

  • Use RTB metrics endpoints when you need performance data for Advertisers, Campaigns, or Lines.
  • Use Custom Reports when you need specific dimensions, metrics, date ranges, or greater reporting granularity.
  • For Master Seat reporting across Sub-Seats, use /rtb/metrics/line?sub-seats-only=true with the Master Seat credentials when Line-level reporting provides the required data.
  • Request only the dimensions and metrics required for the use case to avoid unnecessarily large reports.
  • Use a consistent timezone when storing or comparing reporting data.
  • Store Pontiac object IDs along with object names so reporting can be reliably associated with the correct Advertisers, Campaigns, Lines, and Creatives.
  • For reports that are generated asynchronously, confirm that the report has completed before attempting to retrieve the results.

For the complete list of reporting endpoints, dimensions, metrics, and supported request parameters, refer to the current Pontiac API documentation: https://api.pontiac.media/docs/#/

© 2026 Pontiac Wiki Sec · All Rights Reserved · Developed by RDK

  • Contact Us
  • Privacy Policy
  • Terms & Conditions
  • Pontiac.media