API

Our API (Application Programming Interface) enables users to interact with Pontiac programmatically, allowing them to integrate Pontiac’s ad buying capability with external applications. This allows campaign setup, reporting, and optimizations to be automated or controlled without user interaction with the Pontiac interface.

API integration is for programmers (or teams with programmers) who wish to include ad buying or reporting into their apps.

For example:

  • If you are a publisher with clients that advertise on your properties and you want to help them to advertise across the open web you can integrate Pontiac into your own interface.
  • If you are an agency that has a proprietary platform for reporting or submitting insertion orders, you can easily automate campaign setups.
  • If you are a trading desk with your own traders and optimization strategies, you can automate those optimizations.

Getting Started
       Example Code
Remarketing Campaign Tutorial

       Authentication
       Creating a New Advertiser
       Uploading a Creative
       Posting Pixels
       Posting a Line Item
       Placing Pixels

 

Getting Started

If you would like to use our API for your campaigns, email your Account Manager. Access is approved on a case by case basis. If your account is granted API access you will receive a username and temporary password to login to the Pontiac sandbox environment.

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.

General documentation for end points and object structure is available here:

https://api.pontiac.media/swagger#/

The front end for the sandbox can be found here:

https://sandbox.pontiac.media:8085

All examples are given using curl. Curl or cURL stands for client URL and is a simple tool built into unix systems that allows users to make network requests from their command line. If you are running windows you have to install a tool like Cygwin or enable unix commands in your command line. There is also an online tool that can be found in the link below that will allow you to make curl commands from the internet. Although the last option is the most convenient it is the least secure.

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

 

Example Code

The full implementation of the steps to set up a campaign, written in Python can be found here: pythonPontiacTutorial.

Make sure that you set your credentials and start and end date in the file pontiacTutorial.py before running it.

pontiacTutorial.py will be the entry point.

To install the latest version of python and for more help on getting started with Python: https://www.python.org/

 

Remarketing Campaign Tutorial

In the following example we will set up a line for remarketing that targets the whole US. At the end of the tutorial all you would need to do is place the segment pixels (html) on your home page and the conversion pixels (also html) on your checkout page. A full script is provided in python. If you were to run this with a funded Pontiac account and place the pixels correctly you would have a live remarketing campaign.

 

Authentication

For this we will send a simple post request via curl.

curl -X POST https://api.pontiac.media/auth -d ‘{“auth”:{“userName”:”user1″, “password”:”myPassword”}}’

Response:

{

   “timestamp”:”Tue Aug 04 18:55:27 UTC 2020″,

   “response”:{

      “userId”:2342,

      “seatId”:1000,

      “authToken”:”eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjI3MDIsInVzZXJJZCI6MzU1LCJleHBpcmVzIjoiMjAyMC0wOC0SDsawMjo1NToyNyJ9.d6gUDLA_Yx_Em5REoathACFMPcfv1TgL8B87P19q7yA”,

      “expiration”:”2020-08-05T02:55:27″,

      “userName”:” user1″,

      “revType”:”costPlus”,

      “seatLoginCount”:171,

      “userLoginCount”:158,

      “funded”:1,

      “isAdmin”:0,

      “appVersion”:”1.14.0.43abcc29″,

      “passwordChanged”:1,

      “userRole”:”user”

   

}

}

 

The token received in the field authToken is to be passed in on all subsequent requests as a header called “auth”.

 

For example, the following is a get request for an existing advertiser:

 

curl -X GET -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjI3MDIsInVzZXJJZCI6MzU1LCJleHBpcmVzIjoiMjAyMC0wOC0SDsawMjo1NToyNyJ9.d6gUDLA_Yx_Em5REoathACFMPcfv1TgL8B87P19q7yA’  ‘https://api.pontiac.media/pontiac/advertiser?advertiser-id=1234’

 

Response:

{

   “timestamp”:”Tue Aug 04 19:07:09 UTC 2020″,

   “response”:{

      “Advertisers”:[

         {

            “pontiacAdvertiserId”:2923,

            “name”:”testAdvertiser.”,

            “status”:1,

            “seatId”:1000,

            “insertionOrdersEnabled”:1,

            “gdprEnabled”:0,

            “politicalContentEnabled”:0,

            “hasProfile”:1

         

}

]

},

   “accountStatus”:1,

   “seatId”:1000

}

 

Creating a New Advertiser

Post a new advertiser with the minimum required properties. In this case we are only passing in the name of the advertiser and its state.

curl -X POST -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjI3MDIsInVzZXJJZCI6MzU1LCJleHBpcmVzIjoiMjAyMC0wOC0SDsawMjo1NToyNyJ9.d6gUDLA_Yx_Em5REoathACFMPcfv1TgL8B87P19q7yA’  ‘https://api.pontiac.media/pontiac/advertiser’ -d ‘{

   “name”:”newAdvertiser”,

   “status”:0

}’

 

Response:

{

   “timestamp”:”Mon Aug 17 20:56:19 UTC 2020″,

   “response”:{

   “Advertisers”:[

      {

         “pontiacAdvertiserId”:1713,

         “name”:”newAdvertiser”,

         “status”:0,

         “seatId”:1000,

         “insertionOrdersEnabled”:1,

         “gdprEnabled”:0,

         “politicalContentEnabled”:0,

         “hasProfile”:0,

         “gamblingEnabled”:0

      }

   ]

   },

   “accountStatus”:1,

   “seatId”:1000

}

 

From this you will need the pontiacAdvertiserId, in this case 1713. It will be used when creating the Line and the Creatives.

 

Uploading a Creative

Here we are posing a small 11 kb image.

This image must be serialized using base64 encoding and passed into the field encodedRawCreative.

To encode an image you can use https://www.base64-image.de/ or find a library for the language you are using to do it programmatically. There is an example in the python code that accompanies this tutorial

For this call you will see that you need to pass in the Advertiser ID when posting the Creative.

curl -X POST -H ‘auth:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjUgMDI6Mjc6MTYifQ.JpVp62T-VEbuxquTXHXaKqhrqEIef1Hq3PpaRgExzrg’ -d ‘{

“name”:”testSmallCreative”,

         “pontiacAdvertiserId”:1713,

         “creativeProperties”:{

            “clickURL”:”http://pontiac.media”,

“encodedRawCreative”:”/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADIiJSwlHzIsKSw4NTI7S31RS0VFS5ltc1p9tZ++u7Kfr6zI4f/zyNT/16yv+v/9////////wfD/////////////2wBDATU4OEtCS5NRUZP/zq/O////////////////////////////////////////////////////////////////////wAARCAD6ASwDAREAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAAAAECAwQF/8QANxABAAIBAwMDAwMDAwMDBQAAAQI…
…JitQd8lVHIJtT57YEcKOBHAmAfvgPvgMCGFXAGRY0YIpkqxoxVjRkajZirGjJWo2ZKrcciV0MsRowjWCmEocnzlSqcn/APTlSsvB8OWJWX/bLGaw85qM1l4yxmsOEqPGEZcDDgjLzgR74WI4rUHIsRyERwI4UwRHAhyYB5cUMBgf/9k=”,

“width”:300,

“height”:250

},

“status”:1,

“creativeType”:”image”

}’ ‘https://api.pontiac.media/pontiac/creative?advertiser-id=1713’

(see full encoded Creative here: Encoded Creative)

 

Response with the wrapper and read only fields:

{“timestamp”:”Mon Aug 24 19:03:28 UTC 2020″,”response”:{“Creatives”:[{“pontiacCreativeId”:28214,”seatId”:1000,”name”:”testSmallCreative”,”pontiacAdvertiserId”:1713,”creativeProperties”:{“clickURL”:”http://pontiac.media”,”thirdPartyPixelsIds”:[],”encodedRawCreative”:”/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADIiJSwlHzIsKSw4NTI7S31RS0VFS5ltc1p9tZ++u7Kfr6zI4f/zyNT/16yv+v/9////////wfD/////////////2wBDATU4OEtCS5NRUZP/zq/O////////////////////////////////////////////////////////////////////wAARCAD6ASwD…
…wI4UwRHAhyYB5cUMBgf/9k=”,”width”:300,”height”:250,”segmentPixelIds”:[]},”status”:1,”auditData”:{“status”:”pending”},”creativeType”:”image”,”clickTracking”:0,”soonToExpire”:0,”isSensitive”:0,”categories”:[],”isMalicious”:0,”isUnusable”:0}]},”accountStatus”:1,”seatId”:1000}

(see full Response here: Response)

 

From this we will need the pontiacCreativeId. We will pass this in when making the Line, in this example it is 28214.

 

Posting Pixels

Pixels are used for tracking success as well as building an audience. The code to fire pixels has to be placed directly on your page. The segment pixel will go on your landing page and the conversion pixel will go on your checkout page (or whatever page is used to track the success of your campaign).

When creating pixels there are 2 steps. They first have to be made via a post request. Once that happens there is a delay until the “exchangeId” is assigned to the pixel. Because of this you must submit a get request later to retrieve the exchangeId to actually place the pixels.

 

Post a Conversion Pixel

curl -X POST -H ‘auth:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjUgMDI6Mjc6MTYifQ.JpVp62T-VEbuxquTXHXaKqhrqEIef1Hq3PpaRgExzrg’ -d ‘{

“name”:”testConversionPixel”,

“pontiacAdvertiserId”:1713,

“status”:1

}’ ‘https://api.pontiac.media/pontiac/conversion-pixel’

 

Response:

{“timestamp”:”Mon Aug 24 19:56:19 UTC 2020″,”response”:{“ConversionPixel”:{“pontiacPixelId”:980,”seatId”:1000,”name”:”testConversionPixel”,”pontiacAdvertiserId”:1713,”triggerType”:”hybrid”,”status”:1,”orderIdMacro”:0,”valueMacro”:0,”postViewExpireDays”:30,”postClickExpireDays”:30,”minMinutesPerConv”:10}},”accountStatus”:1,”seatId”:1000}

 

From this we will need the pontiacPixelId. We will pass this in when making the Line, in this example it is 980.

 

Post a Segment Pixel

curl -X POST -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjYgMDE6Mzk6MDkifQ.W475vyhEafa9TN94OaLkUEHWF7YkI6t-tJbKBIYqN6A’ -d ‘{

“name”:”testSegmemtPixel”,

“pontiacAdvertiserId”:1713

}’ ‘https://api.pontiac.media/pontiac/segment’

 

Response:

{“timestamp”:”Tue Aug 25 17:39:44 UTC 2020″,”response”:{“SegmentPixel”:{“pontiacSegmentId”:22672,”seatId”:1000,”name”:”testSegmemtPixel”,”pontiacAdvertiserId”:1713,”cost”:0.0,”segmentPixelType”:”firstParty”}},”accountStatus”:1,”seatId”:1000}

 

From this we will need the pontiacSegmentId. We will pass this in when making the Line, in this example it is 22672.

 

Posting a Line Item

At this point we have the Advertiser ID, Creative ID, Conversion Pixel ID and the Segment Pixel ID. We will post a simple, mostly default Line targeting a couple of zip codes and a couple of select sellers.

 

Advertiser ID 1713

Creative ID 28214

Conversion Pixel ID 980

Segment Pixel ID 22672

 

 curl -X POST -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjYgMDE6Mzk6MDkifQ.W475vyhEafa9TN94OaLkUEHWF7YkI6t-tJbKBIYqN6A’ -d ‘ {

   “pontiacAdvertiserId”:1713,

   “deployDate”:20200825,

   “status”:0,

   “startDate”:20200825,

   “endDate”:20200829,

   “totalBudgetSpend”:10.0,

   “dailyBudgetSpend”:2.2,

   “budgetType”:”spend”,

   “goalType”:”ctr”,

   “name”:”exampleLine2.1″,

   “budgetMultiplier”:1.1,

   “allowDynBudgetMultiplier”:0,

   “optSchedule”:{

   “days”:[

      “thursday”

   ]

   },

   “bidData”:{

   “range”:{

      “max”:3.75,

      “min”:0.26

   },

   “base”:2.31

   },

   “conversionPixelsIds”:[

   980

   ],

   “segmentGroups”:[

   {

      “segments”:[

         {

            “id”:22672,

            “segmentType”:”firstParty”,

            “action”:”include”,

            “status”:1

         }

      ],

“isCustomDomainGroup”:false

   }

   ],

   “creativesIds”:[

   28214

   ],

   “targets”:{

   “geoTargets”:{

      “action”:”include”,

      “geos”:[

         {

            “name”:”United States”,

            “code”:”US”,

            “id”:233,

            “type”:”country”

         },

         {

            “countryCode”:”US”,

            “code”:”11215″,

            “type”:”zip”

         },

         {

            “countryCode”:”US”,

            “code”:”11238″,

            “type”:”zip”

         },

         {

            “countryCode”:”US”,

            “code”:”07481″,

            “type”:”zip”

         },

         {

            “countryCode”:”US”,

            “code”:”07410″,

            “type”:”zip”

         }

      ]

   },

   “dayPartTargets”:{

      “dayParts”:[

         {

            “day”:”sunday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”monday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”tuesday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”wednesday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”thursday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”friday”,

            “startHour”:6,

            “endHour”:23

         },

         {

            “day”:”saturday”,

            “startHour”:6,

            “endHour”:23

         }

      ]

   },

   “inventoryTypeTargets”:{

      “types”:[

         “web”,

         “mobileWeb”

      ]

   },

   “osTargets”:{

      “action”:”include”,

      “systems”:[

        {

            “name”:”Android”,

            “id”:2

         },

         {

            “name”:”Apple iOS”,

            “id”:3

         },

         {

            “name”:”Apple Mac”,

            “id”:4

         },

        {

            “name”:”Microsoft Windows”,

            “id”:5

         }

      ]

   },

   “exchangeTargets”:{

      “action”:”include”,

      “exchanges”:[

         {

            “id”:2,

            “name”:”Pubmatic”,

            “category”:”Exchange”,

            “sensitive”:0

         },

         {

            “id”:8,

            “name”:”OpenX”,

            “category”:”Exchange”,

            “sensitive”:1

        },

         {

            “id”:9,

            “name”:”Rubicon”,

            “category”:”Exchange”,

            “sensitive”:0

         },

         {

            “id”:10,

            “name”:”AppNexus (Tier 3) Open”,

            “category”:”Network”,

            “sensitive”:0

         },

         {

            “id”:11,

            “name”:”AppNexus (Tier 2) Premier”,

            “category”:”Network”,

            “sensitive”:1

         },

        {

            “id”:12,

            “name”:”AppNexus (Tier 2) Open”,

            “category”:”Network”,

            “sensitive”:0

         }

      ]

   }

   },

   “frequency”:{

   “maxLifetimeImpressions”:12,

   “maxDailyImpressions”:4,

   “allowDyn”:1

   },

   “creativeSuperType”:”standard”

}’  ‘https://api.pontiac.media/pontiac/line’

 

{“timestamp”:”Tue Aug 25 18:33:36 UTC 2020″,”response”:{“Lines”:[{“pontiacLineId”:6802,”pontiacAdvertiserId”:1713,”deployDate”:20200825,”status”:0,”seatId”:1000,”startDate”:20200825,”endDate”:20200829,”totalBudgetSpend”:10.0,”dailyBudgetSpend”:2.2,”budgetType”:”spend”,”goalType”:”ctr”,”name”:”exampleLine2.1″,”budgetMultiplier”:1.1,”allowDynBudgetMultiplier”:0,”optSchedule”:{“days”:[“thursday”]},”bidData”:{“range”:{“max”:3.75,”min”:0.26},”base”:2.31},”conversionPixelsIds”:[980],”segmentGroups”:[{“segments”:[{“id”:22672,”segmentType”:”firstParty”,”action”:”include”,”status”:1}],”isCustomDomainGroup”:0}],”creativesIds”:[28214],”targets”:{“geoTargets”:{“action”:”include”,”geos”:[{“name”:”United States”,”code”:”US”,”id”:233,”type”:”country”},{“countryCode”:”US”,”code”:”11215″,”type”:”zip”},{“countryCode”:”US”,”code”:”11238″,”type”:”zip”},{“countryCode”:”US”,”code”:”07481″,”type”:”zip”},{“countryCode”:”US”,”code”:”07410″,”type”:”zip”}]},”dayPartTargets”:{“dayParts”:[{“day”:”sunday”,”startHour”:6,”endHour”:23},{“day”:”monday”,”startHour”:6,”endHour”:23},{“day”:”tuesday”,”startHour”:6,”endHour”:23},{“day”:”wednesday”,”startHour”:6,”endHour”:23},{“day”:”thursday”,”startHour”:6,”endHour”:23},{“day”:”friday”,”startHour”:6,”endHour”:23},{“day”:”saturday”,”startHour”:6,”endHour”:23}]},”inventoryTypeTargets”:{“types”:[“web”,”mobileWeb”]},”osTargets”:{“action”:”include”,”systems”:[{“name”:”Android”,”id”:2},{“name”:”Apple iOS”,”id”:3},{“name”:”Apple Mac”,”id”:4},{“name”:”Microsoft Windows”,”id”:5}]},”exchangeTargets”:{“action”:”include”,”exchanges”:[{“id”:2,”name”:”Pubmatic”,”category”:”Exchange”,”sensitive”:0},{“id”:8,”name”:”OpenX”,”category”:”Exchange”,”sensitive”:1},{“id”:9,”name”:”Rubicon”,”category”:”Exchange”,”sensitive”:0},{“id”:10,”name”:”AppNexus (Tier 3) Open”,”category”:”Network”,”sensitive”:0},{“id”:11,”name”:”AppNexus (Tier 2) Premier”,”category”:”Network”,”sensitive”:1},{“id”:12,”name”:”AppNexus (Tier 2) Open”,”category”:”Network”,”sensitive”:0}]}},”frequency”:{“maxLifetimeImpressions”:12,”maxDailyImpressions”:4,”allowDyn”:1},”creativeSuperType”:”standard”,”budgetsAreFixed”:0,”lineSetupType”:”simple”,”segmentBooleanOperator”:”or”,”dailyPacing”:”even”,”isRemarketing”:0,”campaignType”:1,”sensitive”:0,”statusInfo”:[],”minMinutesPerImpEnabled”:0}]},”accountStatus”:1,”seatId”:1000}

 

Placing Pixels

Now that we have everything set up the last step is to get the 2 pixels (segment and conversion) and get their “exchangeId”.

 

Get Request for Segment Pixel

curl -X GET -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjYgMDE6Mzk6MDkifQ.W475vyhEafa9TN94OaLkUEHWF7YkI6t-tJbKBIYqN6A’  ‘https://api.pontiac.media/pontiac/segment?segment-id=22672’

Response:

{“timestamp”:”Tue Aug 25 17:43:57 UTC 2020″,”response”:{“SegmentPixel”:{“pontiacSegmentId”:22672,”exchangeId”:23462667,”seatId”:1000,”name”:”testSegmemtPixel”,”pontiacAdvertiserId”:1713,”cost”:0.0,”segmentPixelType”:”firstParty”}},”accountStatus”:1,”seatId”:1000}

From this we will need the exchangeId, in this example it is 23462667.

 

Get Request for Conversion Pixel

curl -X GET -H ‘auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZWF0SWQiOjEwMDAsInVzZXJJZCI6NCwiZXhwaXJlcyI6IjIwMjAtMDgtMjYgMDE6Mzk6MDkifQ.W475vyhEafa9TN94OaLkUEHWF7YkI6t-tJbKBIYqN6A’  ‘https://api.pontiac.media/pontiac/conversion-pixel?pixel-id=980’

Response:

{“timestamp”:”Tue Aug 25 17:53:12 UTC 2020″,”response”:{“ConversionPixel”:{“pontiacPixelId”:980,”exchangeId”:1361577,”seatId”:1000,”name”:”testConversionPixel”,”pontiacAdvertiserId”:1713,”triggerType”:”hybrid”,”status”:1,”orderIdMacro”:0,”valueMacro”:0,”postViewExpireDays”:30,”postClickExpireDays”:30,”minMinutesPerConv”:10}},”accountStatus”:1,”seatId”:1000}

From this we will need the exchangeId, in this example it is 1361577.

 

Format to build the correct urls:

Segment Pixels:

https://one.progmxs.com/seg?add=XXXXXXXX&t=2

Conversion Pixels:

https://one.progmxs.com/px?id=XXXXXXXX&t=2

 Just replace the “XXXXXXXX” with the exchange Ids from the responses.

The full html tags with the correct wrappers are as follows:

 

Image pixel for our segment pixel:

<img src=”https://one.progmxs.com/seg?add=23462667&t=2″ width=”1″ height=”1″ />

Image pixel for our conversion pixel:

<img src=”https://one.progmxs.com/px?id=1361577&t=2″ width=”1″ height=”1″ />

 

Place these in the headers of each of the pages that you wish to put them on.