Pontiac Wiki Pontiac Wiki

Bidder API Campaign Tutorial

Bidder API Campaign Tutorial

  • Tutorial Overview
  • Authentication
  • Creating a New Advertiser
  • Uploading a Creative
  • Creating a Pixel
  • Creating a Campaign
  • Creating a Line
  1. Home
  2. API Documentation
  3. Bidder API Campaign Tutorial

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

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

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