# S2S API v2

## S2S Install Attribution Overview

[Chartboost's S2S Install Tracking](/en/advertising/s2stracking/setting-up-s2s-tracking/) program allows advertisers to use attribution data from approved MMPs and run CPI campaigns on the Chartboost network. 

After an app has Requested S2S Install Tracking and Chartboost approves it, the app's CPI campaigns will begin listening only to install postbacks sent to our S2S endpoint and will stop using the Chartboost SDK (if applicable) for install attribution.

<img src="/assets/images/articles/2023_partners_s2sapiv2_cb_clicktracking_diagram-b0a24d6d.png" style="width:500px; background-color: transparent; padding: 10px;"/>

<img src="/assets/images/articles/2023_partners_s2sapiv2_cb_s2s_diagram-18b0c35b.png" style="width:600px; background-color: transparent; padding: 10px;"/>

## Requirements

- Click (and Completed View, if applicable set up by advertiser) event notifications are sent from our servers via HTTPS requests to your tracking URLs via [Chartboost Callbacks](/en/advertising/callbacks/setting-up-callbacks/). Users are sent directly to the app store upon clicking an ad, not to the tracking URL.  The server sends the request to the tracking URL on behalf of the user (via Callbacks).  An `X-Forwarded-For: {IP_ADDRESS}` header is included in the request which can be used to identify the IP of the client.  Additionally, if needed, we can replace the User-Agent header with the device's User-Agent, instead of the default `User-Agent: Chartboost-Callbacks` value.

- Your tracking URL may redirect to subsequent endpoints. If you do redirect to secondary endpoints, you must use 302 HTTP redirects, and the Location URI in the 302 redirect header *must be URL-encoded*.

- Advertisers leveraging Chartboost S2S Install Tracking will need to set up an attributed install postback using our global postback URL. App open (aka bootup) postbacks should also be set up to enable tracking of user retention and to exclude non-attributed users from network campaign targeting (negative targeting).

- All requests must be made via HTTPS (both tracking callbacks and install/open postbacks).


## Attributed Installs

Installs attributed via clicks (and/or completed views if you support view-through attribution) should be sent to this endpoint. For click-through attributions, include the `click_id` parameter; for view-through attributions, include the `completed_view_id` parameter.  Including both `click_id` and `completed_view_id` in the same request is accepted, but at least one is required.  If both are included, the `click_id` takes precedence.

For click-through attributions, you *must* enforce a minimum 7-day attribution window. Chartboost will validate clicks for attribution up to 21 days.

For view-through attributions, there is no minimum attribution window. Chartboost will validate completed views for attribution up to 7 days.

### Global Postback URL
`https://live.chartboost.com/api/v2/attributed_install`

This endpoint receives only attributed install postbacks. Installs will be processed for conversion, stored, and used in reporting.

<ul class="tab" data-tab="6c908f1c-a0ef-4ffc-a381-8dac09b19368" data-name="attributedInstalls">
  
      <li class="active">
          <a href="#">PHP </a>
      </li>
  
      <li>
          <a href="#">Python </a>
      </li>
  
      <li>
          <a href="#">Javascript </a>
      </li>
  
</ul>
<ul class="tab-content" id="6c908f1c-a0ef-4ffc-a381-8dac09b19368" data-name="attributedInstalls">
  
      <li class="active">
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>

<span class="k">const</span> <span class="no">CB_ATTRIBUTION_ENDPOINT</span> <span class="o">=</span> <span class="s2">"https://live.chartboost.com/api/v2/attributed_install"</span><span class="p">;</span>
<span class="k">const</span> <span class="no">CB_API_TOKEN</span> <span class="o">=</span> <span class="s2">"{{your API token}}"</span><span class="p">;</span> 

<span class="nv">$click_id</span> <span class="o">=</span> <span class="s2">"{{the click id}}"</span><span class="p">;</span> <span class="c1"># e.g. "178660e204b0166e0364e637"</span>
<span class="nv">$completed_view_id</span> <span class="o">=</span> <span class="s2">"{{completed view id}}"</span><span class="p">;</span> <span class="c1"># e.g. "178660e204b0166e0364e638", required for view-through attributions</span>

<span class="nv">$data</span> <span class="o">=</span> <span class="nb">json_encode</span><span class="p">(</span><span class="k">array</span><span class="p">(</span>
  <span class="s2">"token"</span>               <span class="o">=&gt;</span> <span class="no">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s2">"click_id"</span>            <span class="o">=&gt;</span> <span class="nv">$click_id</span><span class="p">,</span>
  <span class="s2">"completed_view_id"</span>   <span class="o">=&gt;</span> <span class="nv">$completed_view_id</span>
<span class="p">));</span>


<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
  <span class="s2">"Content-Type"</span> <span class="o">=&gt;</span> <span class="s2">"application/json"</span>
<span class="p">);</span>


<span class="nc">Requests</span><span class="o">::</span><span class="nf">post</span><span class="p">(</span><span class="no">CB_ATTRIBUTION_ENDPOINT</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="cp">?&gt;</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">requests</span>


<span class="n">CB_ATTRIBUTION_ENDPOINT</span> <span class="o">=</span> <span class="s">'https://live.chartboost.com/api/v2/attributed_install'</span>
<span class="n">CB_API_TOKEN</span> <span class="o">=</span> <span class="s">'{{your_api_token}}'</span>

<span class="n">click_id</span> <span class="o">=</span> <span class="s">'{{click id}}'</span>  <span class="c1"># e.g. "178660e204b0166e0364e637"
</span><span class="n">completed_view_id</span> <span class="o">=</span> <span class="s">'{{completed view id}}'</span> <span class="c1"># e.g. "178660e204b0166e0364e638", required for view-through attributions
</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
  <span class="s">'token'</span>               <span class="p">:</span> <span class="n">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s">'click_id'</span>            <span class="p">:</span> <span class="n">click_id</span><span class="p">,</span>
  <span class="s">'completed_view_id'</span>   <span class="p">:</span> <span class="n">completed_view_id</span>
<span class="p">})</span>

<span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/json'</span>
<span class="p">}</span>

<span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">CB_ATTRIBUTION_ENDPOINT</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Example of an attributed install postback, POST request</span>
<span class="kd">var</span> <span class="nx">https</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">https</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">crypto</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">crypto</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">var</span> <span class="nx">data</span><span class="p">,</span> 
    <span class="nx">options</span><span class="p">,</span> 
    <span class="nx">req</span><span class="p">,</span>
    <span class="nx">txn_id_key</span><span class="p">,</span>
    <span class="nx">txn_id_value</span><span class="p">,</span>
    <span class="nx">request_json</span> <span class="o">=</span> <span class="p">{};</span>

<span class="kd">var</span> <span class="nx">click_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{click id}}</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// e.g. "178660e204b0166e0364e637"</span>
<span class="kd">var</span> <span class="nx">completed_view_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{completed view id}}</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// e.g. "178660e204b0166e0364e638, required for view-through attributions</span>

<span class="kd">const</span> <span class="nx">CB_API_TOKEN</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{your_api_token}}</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_HOST</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">live.chartboost.com</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_PATH</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">/api/v2/attributed_install</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_PORT</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">443</span><span class="dl">"</span><span class="p">;</span>

<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">token</span><span class="dl">'</span><span class="p">]</span>    <span class="o">=</span> <span class="nx">CB_API_TOKEN</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">click_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">click_id</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">completed_view_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">completed_view_id</span><span class="p">;</span>

<span class="kd">function</span> <span class="nf">sendInstall</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">data</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">request_json</span><span class="p">);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span>
    <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">host</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_HOST</span><span class="p">,</span>
        <span class="na">path</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_PATH</span><span class="p">,</span>
        <span class="na">port</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_PORT</span><span class="p">,</span>
        <span class="na">method</span><span class="p">:</span> <span class="dl">'</span><span class="s1">POST</span><span class="dl">'</span><span class="p">,</span>
        <span class="na">agent</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="na">headers</span><span class="p">:</span> <span class="p">{</span>
            <span class="dl">'</span><span class="s1">Content-Type</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">application/json</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">Content-Length</span><span class="dl">'</span><span class="p">:</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span>
        <span class="p">}</span>
    <span class="p">};</span>
    <span class="c1">// Build the request using node https module</span>
    <span class="nx">req</span> <span class="o">=</span> <span class="nx">https</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">setEncoding</span><span class="p">(</span><span class="dl">'</span><span class="s1">utf8</span><span class="dl">'</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">statusCode: </span><span class="dl">"</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">);</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Response: </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">chunk</span><span class="p">);</span>
        <span class="p">});</span>
    <span class="p">});</span>
    <span class="nx">req</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
    <span class="nx">req</span><span class="p">.</span><span class="nf">end</span><span class="p">();</span>
    <span class="nf">callback</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// Send it!</span>
<span class="nf">sendInstall</span><span class="p">(</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">  POST request sent to: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">CB_ATTRIBUTION_HOST</span> <span class="o">+</span> <span class="nx">CB_ATTRIBUTION_PATH</span><span class="p">);</span>
  <span class="p">}</span> 
<span class="p">);</span>

<span class="c1">// Valid Request Response</span>
<span class="c1">// {"message":"Install request received!","status":200}</span>
</code></pre></div></div>

</li>
  
</ul>


### Authentication

All API endpoints require a `token` parameter included in the request, which is a public S2S API token unique to your platform.

### Headers

Each request must contain the following headers:

Header                 | Value
----                   | -----
Content-Type           | `application/json`


### Request Parameters

Each request must contain the following parameters:

Name          | Required | Type   | Description
----          | -------- | ----   | -----------
token         | true     | string | Your Chartboost S2S API token
click_id      | true*     | string | Required for click-through attribution
completed_view_id | true*  | string  | Required for view-through attribution


### Method: GET


Click-through attribution:
`GET https://live.chartboost.com/api/v2/attributed_install?token={your API token}&click_id={click id}`


View-through attribution:
`GET https://live.chartboost.com/api/v2/attributed_install?token={your API token}&completed_view_id={completed view id}`

* Note: parameter values can be left blank OR omitted if there is no value, e.g. `https://live.chartboost.com/api/v2/attributed_install?token={{your_api_token}}&click_id=&completed_view_id=12345`


### Method: POST

`POST https://live.chartboost.com/api/v2/attributed_install`





## Opens (Bootups)

Each time a device (either attributed or non-attributed/organic) launches the app, a postback should be sent to this endpoint.  Chartboost uses this data to track player retention as well as for negative-targeting of existing devices. 

If you do not send app open events for non-attributed users, Chartboost cannot avoid showing ads to them.  This may negatively impact advertiser campaign performance.

### Global Postback URL

`https://live.chartboost.com/api/v2/open`

This endpoint receives app open (aka bootups or launches) postbacks.  *NOTE*: This endpoint should also be used for any rejected attributed installs (e.g. suspected fraud rejections).

<ul class="tab" data-tab="68be3c5a-b23a-45b6-b70e-121d6a4bb517" data-name="opensBootups">
  
      <li class="active">
          <a href="#">PHP </a>
      </li>
  
      <li>
          <a href="#">Python </a>
      </li>
  
      <li>
          <a href="#">Javascript </a>
      </li>
  
</ul>
<ul class="tab-content" id="68be3c5a-b23a-45b6-b70e-121d6a4bb517" data-name="opensBootups">
  
      <li class="active">
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>

<span class="k">const</span> <span class="no">CB_ATTRIBUTION_ENDPOINT</span> <span class="o">=</span> <span class="s2">"https://live.chartboost.com/api/v2/open"</span><span class="p">;</span>
<span class="k">const</span> <span class="no">CB_API_TOKEN</span> <span class="o">=</span> <span class="s2">"{{your API token}}"</span><span class="p">;</span> 

<span class="nv">$app_id</span>              <span class="o">=</span> <span class="s2">"{{Chartboost app id}}"</span><span class="p">;</span> 
<span class="nv">$idfa</span>                <span class="o">=</span> <span class="s2">"{{device IDFA}}"</span><span class="p">;</span>
<span class="nv">$gaid</span>                <span class="o">=</span> <span class="s2">"{{device GAID}}"</span><span class="p">;</span>
<span class="nv">$android_id</span>          <span class="o">=</span> <span class="s2">"{{Android ID}}"</span><span class="p">;</span>
<span class="nv">$click_id</span>            <span class="o">=</span> <span class="s2">"{{Click ID}};
</span><span class="nv">$completed_view_id</span><span class="s2">   = "</span><span class="p">{{</span><span class="nc">Completed</span> <span class="nc">View</span> <span class="no">ID</span><span class="p">}};</span>
<span class="nv">$tracking_id</span>         <span class="o">=</span> <span class="s2">"{{tracking URL identifier}}"</span><span class="p">;</span>
<span class="nv">$version</span>             <span class="o">=</span> <span class="s2">"{{app bundle version}}"</span><span class="p">;</span>
<span class="nv">$rejected_reason</span>     <span class="o">=</span> <span class="s2">"{{attributed install rejection reason}}"</span><span class="p">;</span>
<span class="nv">$rejected_value</span>      <span class="o">=</span> <span class="s2">"{{attributed install rejection value}}"</span>

<span class="nv">$data</span> <span class="o">=</span> <span class="nb">json_encode</span><span class="p">(</span><span class="k">array</span><span class="p">(</span>
  <span class="s2">"token"</span>             <span class="o">=&gt;</span> <span class="no">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s2">"app_id"</span>            <span class="o">=&gt;</span> <span class="nv">$app_id</span><span class="p">,</span>
  <span class="s2">"idfa"</span>              <span class="o">=&gt;</span> <span class="nv">$idfa</span><span class="p">,</span>
  <span class="s2">"gaid"</span>              <span class="o">=&gt;</span> <span class="nv">$gaid</span><span class="p">,</span>
  <span class="s2">"uuid"</span>              <span class="o">=&gt;</span> <span class="nv">$android_id</span><span class="p">,</span>
  <span class="s2">"click_id"</span>          <span class="o">=&gt;</span> <span class="nv">$click_id</span><span class="p">,</span>
  <span class="s2">"completed_view_id"</span> <span class="o">=&gt;</span> <span class="nv">$completed_view_id</span>
  <span class="s2">"tracking_id"</span>       <span class="o">=&gt;</span> <span class="nv">$tracking_id</span><span class="p">,</span>
  <span class="s2">"version"</span>           <span class="o">=&gt;</span> <span class="nv">$version</span><span class="p">,</span>
  <span class="s2">"rejected_reason"</span>   <span class="o">=&gt;</span> <span class="nv">$rejected_reason</span><span class="p">,</span>
  <span class="s2">"rejected_value"</span>    <span class="o">=&gt;</span> <span class="nv">$rejected_value</span>
<span class="p">));</span>


<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
  <span class="s2">"Content-Type"</span> <span class="o">=&gt;</span> <span class="s2">"application/json"</span><span class="p">,</span>
<span class="p">);</span>


<span class="nc">Requests</span><span class="o">::</span><span class="nf">post</span><span class="p">(</span><span class="no">CB_ATTRIBUTION_ENDPOINT</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="cp">?&gt;</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">requests</span>


<span class="n">CB_ATTRIBUTION_ENDPOINT</span> <span class="o">=</span> <span class="s">'https://live.chartboost.com/api/v2/open'</span>
<span class="n">CB_API_TOKEN</span> <span class="o">=</span> <span class="s">'{{your_api_token}}'</span>

<span class="n">app_id</span>            <span class="o">=</span> <span class="s">'{{Chartboost app id}}'</span>
<span class="n">idfa</span>              <span class="o">=</span> <span class="s">'{{IDFA}}'</span>
<span class="n">gaid</span>              <span class="o">=</span> <span class="s">'{{GAID}}'</span>
<span class="n">uuid</span>              <span class="o">=</span> <span class="s">'{{Android ID}}'</span>
<span class="n">click_id</span>          <span class="o">=</span> <span class="s">'{{Click ID}}'</span>
<span class="n">completed_view_id</span> <span class="o">=</span> <span class="s">'{{Completed View ID}}'</span>
<span class="n">tracking_id</span>       <span class="o">=</span> <span class="s">'{{tracking URL identifier}}'</span>
<span class="n">version</span>           <span class="o">=</span> <span class="s">'{{app bundle version}}'</span>
<span class="n">rejected_reason</span>   <span class="o">=</span> <span class="s">'{{attributed install rejection reason}}'</span>
<span class="n">rejected_value</span>    <span class="o">=</span> <span class="s">'{{attributed install rejection value}}'</span>

<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
  <span class="s">'token'</span>             <span class="p">:</span> <span class="n">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s">'app_id'</span>            <span class="p">:</span> <span class="n">app_id</span><span class="p">,</span>
  <span class="s">'idfa'</span>              <span class="p">:</span> <span class="n">idfa</span><span class="p">,</span>
  <span class="s">'gaid'</span>              <span class="p">:</span> <span class="n">gaid</span><span class="p">,</span>
  <span class="s">'uuid'</span>              <span class="p">:</span> <span class="n">uuid</span><span class="p">,</span>
  <span class="s">'click_id'</span>          <span class="p">:</span> <span class="n">click_id</span><span class="p">,</span>
  <span class="s">'completed_view_id'</span> <span class="p">:</span> <span class="n">completed_view_id</span>
  <span class="s">'tracking_id'</span>       <span class="p">:</span> <span class="n">tracking_id</span><span class="p">,</span>
  <span class="s">'version'</span>           <span class="p">:</span> <span class="n">version</span><span class="p">,</span>
  <span class="s">'rejected_reason'</span>   <span class="p">:</span> <span class="n">rejected_reason</span><span class="p">,</span>
  <span class="s">'rejected_value'</span>    <span class="p">:</span> <span class="n">rejected_value</span>
<span class="p">})</span>

<span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/json'</span><span class="p">,</span>
<span class="p">}</span>

<span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">CB_ATTRIBUTION_ENDPOINT</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Example of an open postback, POST request</span>
<span class="kd">var</span> <span class="nx">https</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">https</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">crypto</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">crypto</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">var</span> <span class="nx">data</span><span class="p">,</span> 
    <span class="nx">options</span><span class="p">,</span> 
    <span class="nx">req</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">CB_API_TOKEN</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{your_api_token}}</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_HOST</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">live.chartboost.com</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_PATH</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">/api/v2/open</span><span class="dl">"</span><span class="p">,</span>
      <span class="nx">CB_ATTRIBUTION_PORT</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">443</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">var</span> <span class="nx">app_id</span>             <span class="o">=</span> <span class="dl">"</span><span class="s2">{{Chartboost app id}}</span><span class="dl">"</span><span class="p">,</span> 
    <span class="nx">idfa</span>               <span class="o">=</span> <span class="dl">"</span><span class="s2">{{IDFA}}</span><span class="dl">"</span><span class="p">,</span> 
    <span class="nx">gaid</span>               <span class="o">=</span> <span class="dl">"</span><span class="s2">{{GAID}}</span><span class="dl">"</span><span class="p">,</span> 
    <span class="nx">uuid</span>               <span class="o">=</span> <span class="dl">"</span><span class="s2">{{Android ID}}</span><span class="dl">"</span><span class="p">,</span>
    <span class="nx">click_id</span>           <span class="o">=</span> <span class="dl">"</span><span class="s2">{{Click ID}}</span><span class="dl">"</span><span class="p">,</span>
    <span class="nx">completed_view_id</span>  <span class="o">=</span> <span class="dl">"</span><span class="s2">{{Completed View ID}}</span><span class="dl">"</span>
    <span class="nx">tracking_id</span>        <span class="o">=</span> <span class="dl">"</span><span class="s2">{{tracking URL identifier}}</span><span class="dl">"</span><span class="p">,</span> 
    <span class="nx">version</span>            <span class="o">=</span> <span class="dl">"</span><span class="s2">{{app bundle version}}</span><span class="dl">"</span><span class="p">;</span>
    <span class="nx">rejected_reason</span>    <span class="o">=</span> <span class="dl">"</span><span class="s2">{{attributed install rejection reason}}</span><span class="dl">"</span>
    <span class="nx">rejected_value</span>     <span class="o">=</span> <span class="dl">"</span><span class="s2">{{attributed install rejection value}}</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">var</span> <span class="nx">request_json</span> <span class="o">=</span> <span class="p">{};</span>

<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">app_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">app_id</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">idfa</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">idfa</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">gaid</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">gaid</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">uuid</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">uuid</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">click_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">click_id</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">completed_view_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">completed_view_id</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">tracking_id</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">tracking_id</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">version</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">version</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">rejected_reason</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">rejected_reason</span><span class="p">;</span>
<span class="nx">request_json</span><span class="p">[</span><span class="dl">'</span><span class="s1">rejected_value</span><span class="dl">'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">rejected_value</span><span class="p">;</span>


<span class="kd">function</span> <span class="nf">sendInstall</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">data</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">request_json</span><span class="p">);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span>
    <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">host</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_HOST</span><span class="p">,</span>
        <span class="na">path</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_PATH</span><span class="p">,</span>
        <span class="na">port</span><span class="p">:</span> <span class="nx">CB_ATTRIBUTION_PORT</span><span class="p">,</span>
        <span class="na">method</span><span class="p">:</span> <span class="dl">'</span><span class="s1">POST</span><span class="dl">'</span><span class="p">,</span>
        <span class="na">agent</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="na">headers</span><span class="p">:</span> <span class="p">{</span>
            <span class="dl">'</span><span class="s1">Content-Type</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">application/json</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">Content-Length</span><span class="dl">'</span><span class="p">:</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span>
        <span class="p">}</span>
    <span class="p">};</span>
    <span class="c1">// Build the request using node https module</span>
    <span class="nx">req</span> <span class="o">=</span> <span class="nx">https</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">setEncoding</span><span class="p">(</span><span class="dl">'</span><span class="s1">utf8</span><span class="dl">'</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">statusCode: </span><span class="dl">"</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">);</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Response: </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">chunk</span><span class="p">);</span>
        <span class="p">});</span>
    <span class="p">});</span>
    <span class="nx">req</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
    <span class="nx">req</span><span class="p">.</span><span class="nf">end</span><span class="p">();</span>
    <span class="nf">callback</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// Send it!</span>
<span class="nf">sendInstall</span><span class="p">(</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">  POST request sent to: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">CB_ATTRIBUTION_HOST</span> <span class="o">+</span> <span class="nx">CB_ATTRIBUTION_PATH</span><span class="p">);</span>
  <span class="p">}</span> 
<span class="p">);</span>

<span class="c1">// Valid Request Response</span>
<span class="c1">// {"message":"Bootup request received!","status":200}</span>
</code></pre></div></div>

</li>
  
</ul>


### Authentication

All API endpoints require a `token` parameter included in the request, which is your public S2S API token.

### Headers

Each request must contain the following headers:

Header                 | Value
----                   | -----
Content-Type           | `application/json`


### Request Parameters

Each request must use these parameters:

Name          | Required | Type   | Description
----          | -------- | ----   | -----------
token         | true     | string | Your Chartboost S2S API token.
app_id        | true     | string | Chartboost app id.
idfa          | true*    | string | Device Identifier For Advertising for iOS app.
gaid          | true*    | string | Device Google Advertising Identifier for Google Play app.
uuid          | true*    | string | Device Android Identifier for Amazon app.  Recommended to send for Google Play apps as well, as a fallback in case GAID in unavailable.
click_id      | false*    | string | Click ID if available.  Required for rejected installs.
completed_view_id | false* | string | Completed View ID if available. Required for rejected installs.
tracking_id     | false     | string | A value used to verify the correct tracking URL is in use for the app, used for automated S2S approval of an app.
version         | false     | string | The app's package version. Used for automated S2S approval of the app.
rejected_reason | false     | string | For a rejected install. The reason code for the rejection.
rejected_value  | false     | string | For a rejected install. Metadata associated with the reason code.
match_type      | false     | string | Represents the method of attribution determination (e.g. fingerprinting, device ID, google referrer, etc.)


### Method: GET

iOS:

```
GET https://live.chartboost.com/api/v2/open?token={your API token}&app_id={Chartboost app id}&idfa={device IDFA}&tracking_id={TRACKING ID}&version={APP VERSION}&rejected_reason={REJECTED_REASON}&rejected_value={REJECTED_VALUE}
```

Android:

```
GET https://live.chartboost.com/api/v2/open?token={your API token}&app_id={Chartboost app id}&gaid={device GAID}&uuid={device Android ID}&tracking_id={TRACKING ID}&version={APP VERSION}&rejected_reason={REJECTED_REASON}&rejected_value={REJECTED_VALUE}
```

Amazon:

```
GET https://live.chartboost.com/api/v2/open?token={your API token}&app_id={Chartboost app id}&uuid={device Android ID}&gaid={device Android Advertising ID, GAID or Amazon Fire Advertising ID}&tracking_id={TRACKING ID}&version={APP VERSION}&rejected_reason={REJECTED_REASON}&rejected_value={REJECTED_VALUE}
```


### Method: POST

`POST https://live.chartboost.com/api/v2/open`



## In-app Purchase Events
For a more complete analysis of campaign performance as well as campaign optimization, Chartboost advertisers can configure MMPs to send their in-app purchase event data to Chartboost.  MMPs can use the instructions on this page to build their initial in-app purchase tracking integration.

### Overview

The Post-Install Analytics (PIA) integration lets Chartboost advertisers share IAP data for post-campaign analysis and optimization -- we consider payer %, ARPU, purchase counts, ARPPU, ROAS, and more. Setting up postbacks for this data is strongly recommended.  Any other custom in-app events, for example Tutorial Completion, Player Registration, etc., are *not supported*. 

<ul class="tab" data-tab="361cee2d-2d17-46c7-ac6a-4eae68c31b8f" data-name="inappPurchaseEvent">
  
      <li class="active">
          <a href="#">PHP </a>
      </li>
  
      <li>
          <a href="#">Python </a>
      </li>
  
      <li>
          <a href="#">Javascript </a>
      </li>
  
</ul>
<ul class="tab-content" id="361cee2d-2d17-46c7-ac6a-4eae68c31b8f" data-name="inappPurchaseEvent">
  
      <li class="active">
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>

<span class="k">const</span> <span class="no">CB_PIA_ENDPOINT</span> <span class="o">=</span> <span class="s2">"https://live.chartboost.com/event_service/v3/track"</span><span class="p">;</span>
<span class="k">const</span> <span class="no">CB_API_TOKEN</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{</span><span class="nv">{your_api_token}</span><span class="si">}</span><span class="s2">"</span><span class="p">;</span> 
<span class="k">const</span> <span class="no">CB_API_SECRET</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{</span><span class="nv">{your_api_secret}</span><span class="si">}</span><span class="s2">"</span><span class="p">;</span>

<span class="nv">$app_id</span> <span class="o">=</span> <span class="s2">"54ecc0535beacdc1e1eff778"</span><span class="p">;</span>  <span class="c1"># replace this with your app id</span>
<span class="nv">$app_signature</span> <span class="o">=</span> <span class="s2">"601be68e3bb4e7eb953024eb4f2ac03376e2c2fb"</span><span class="p">;</span>  <span class="c1"># replace this with your app signature</span>
<span class="nv">$gaid</span> <span class="o">=</span> <span class="s2">"8df6c9bf-d647-4400-bc13-7ff317ff0003"</span><span class="p">;</span>  <span class="c1"># example Google Advertising ID</span>
<span class="nv">$ifa</span> <span class="o">=</span> <span class="s2">"8df6c9bf-d647-4400-bc13-7ff317ff0004"</span><span class="p">;</span>  <span class="c1"># example iOS Identifier For Advertising</span>
<span class="nv">$product_id</span> <span class="o">=</span> <span class="s2">"bag_of_gems"</span><span class="p">;</span>  <span class="c1"># example `product_id`</span>
<span class="nv">$currency</span> <span class="o">=</span> <span class="s2">"USD"</span><span class="p">;</span>  <span class="c1"># example `currency` code</span>
<span class="nv">$price</span> <span class="o">=</span> <span class="mf">1.99</span><span class="p">;</span>  <span class="c1"># example `price`</span>
<span class="nv">$localized_title</span> <span class="o">=</span> <span class="s2">"bolsa de gemas"</span><span class="p">;</span>  <span class="c1"># optional, used for translating product name from English to another language</span>
<span class="nv">$localized_description</span> <span class="o">=</span> <span class="s2">"un bolsa de gemas"</span><span class="p">;</span>  <span class="c1"># optional, used for translating product description from English to another language</span>

<span class="nv">$data</span> <span class="o">=</span> <span class="nb">json_encode</span><span class="p">(</span><span class="k">array</span><span class="p">(</span>
    <span class="s2">"app_id"</span> <span class="o">=</span> <span class="o">&gt;</span> <span class="nv">$app_id</span><span class="p">,</span>
    <span class="s2">"gaid"</span> <span class="o">=&gt;</span> <span class="nv">$gaid</span><span class="p">,</span>
    <span class="c1"># "ifa" = $ifa,</span>
    <span class="s2">"iap"</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span>
            <span class="s2">"product_id"</span><span class="o">:</span> <span class="nv">$product_id</span><span class="p">,</span> 
            <span class="s2">"currency"</span><span class="o">:</span> <span class="nv">$currency</span><span class="p">,</span> 
            <span class="s2">"price"</span><span class="o">:</span> <span class="nv">$price</span><span class="p">,</span> 
            <span class="s2">"localized_title"</span><span class="o">:</span> <span class="nv">$localized_title</span><span class="p">,</span> 
            <span class="s2">"localized_description"</span><span class="o">:</span> <span class="nv">$localized_description</span>
    <span class="p">),</span>
<span class="p">));</span>

<span class="c1"># Create the header signature</span>
<span class="nv">$descriptor</span> <span class="o">=</span> <span class="s2">"action:pia</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="no">CB_API_SECRET</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">app_signature</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">data</span><span class="p">;</span>
<span class="nv">$signature</span> <span class="o">=</span> <span class="n">crypto</span><span class="mf">.</span><span class="nf">createHash</span><span class="p">(</span><span class="s1">'sha256'</span><span class="p">)</span><span class="mf">.</span><span class="nf">update</span><span class="p">(</span><span class="n">descriptor</span><span class="p">)</span><span class="mf">.</span><span class="nf">digest</span><span class="p">(</span><span class="s1">'hex'</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
  <span class="s2">"Content-Type"</span> <span class="o">=&gt;</span> <span class="s2">"application/json"</span><span class="p">,</span>
  <span class="s2">"X-Chartboost-Token"</span> <span class="o">=&gt;</span> <span class="no">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s2">"X-Chartboost-Signature"</span> <span class="o">=&gt;</span> <span class="nv">$signature</span>
<span class="p">);</span>

<span class="c1"># Send the postback</span>
<span class="nc">Requests</span><span class="o">::</span><span class="nf">post</span><span class="p">(</span><span class="no">CB_PIA_ENDPOINT</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="cp">?&gt;</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">requests</span>

<span class="n">CB_PIA_ENDPOINT</span> <span class="o">=</span> <span class="s">'https://live.chartboost.com/event_service/v3/track'</span>
<span class="n">CB_API_TOKEN</span> <span class="o">=</span> <span class="s">'{{your_api_token}}'</span>
<span class="n">CB_API_SECRET</span> <span class="o">=</span> <span class="s">'{{your_api_secret}}'</span>

<span class="n">app_id</span> <span class="o">=</span> <span class="s">'54ecc0535beacdc1e1eff778'</span>  <span class="c1"># replace this with your app id
</span><span class="n">app_signature</span> <span class="o">=</span> <span class="s">'601be68e3bb4e7eb953024eb4f2ac03376e2c2fb'</span>  <span class="c1"># replace this with your app signature
</span><span class="n">gaid</span> <span class="o">=</span> <span class="s">'8df6c9bf-d647-4400-bc13-7ff317ff0003'</span>  <span class="c1"># example Google Advertising ID
</span><span class="n">ifa</span> <span class="o">=</span> <span class="s">'8DF6C9BF-D647-4400-BC13-7FF317FF0004'</span>  <span class="c1"># example iOS Identifier For Advertising
</span><span class="n">fire_adid</span> <span class="o">=</span> <span class="s">'8df6c9bf-d647-4400-bc13-7ff317f046f5'</span>  <span class="c1"># example FireOS Advertising Identifier
</span><span class="n">uuid</span> <span class="o">=</span> <span class="s">'8df6c9bf0'</span>  <span class="c1"># example legacy Android ID
</span><span class="n">product_id</span> <span class="o">=</span> <span class="s">'bag_of_gems'</span>  <span class="c1"># example `product_id`
</span><span class="n">currency</span> <span class="o">=</span> <span class="s">'USD'</span>  <span class="c1"># example `currency` code
</span><span class="n">price</span> <span class="o">=</span> <span class="mf">1.99</span>  <span class="c1"># example `price`
</span><span class="n">localized_title</span> <span class="o">=</span> <span class="s">'bolsa de gemas'</span>  <span class="c1"># optional, used if translating product title from English to another language
</span><span class="n">localized_description</span> <span class="o">=</span> <span class="s">'un bolsa de gemas'</span>  <span class="c1"># optional, used if translating product description from English to another language
</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
    <span class="s">'app_id'</span><span class="p">:</span> <span class="n">app_id</span><span class="p">,</span>
    <span class="s">'gaid'</span><span class="p">:</span> <span class="n">gaid</span><span class="p">,</span>
    <span class="c1"># 'ifa': ifa,
</span>    <span class="c1"># 'fire_adid: fire_adid,
</span>    <span class="c1"># 'uuid': uuid,
</span>    <span class="s">'iap'</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">'product_id'</span><span class="p">:</span> <span class="n">product_id</span><span class="p">,</span>
        <span class="s">'currency'</span><span class="p">:</span> <span class="n">currency</span><span class="p">,</span>
        <span class="s">'price'</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
        <span class="s">'localized_title'</span><span class="p">:</span> <span class="n">localized_title</span><span class="p">,</span>
        <span class="s">'localized_description'</span><span class="p">:</span> <span class="n">localized_description</span>
    <span class="p">}</span>
<span class="p">})</span>

<span class="c1"># Create the header signature
</span><span class="n">descriptor_template</span> <span class="o">=</span> <span class="s">'action:pia</span><span class="se">\n</span><span class="s">{}</span><span class="se">\n</span><span class="s">{}</span><span class="se">\n</span><span class="s">{}'</span>
<span class="n">descriptor</span> <span class="o">=</span> <span class="n">descriptor_template</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">CB_API_SECRET</span><span class="p">,</span> <span class="n">app_signature</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="n">signature</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="n">descriptor</span><span class="p">).</span><span class="nf">hexdigest</span><span class="p">()</span>

<span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/json'</span><span class="p">,</span>
  <span class="s">'X-Chartboost-Token'</span><span class="p">:</span> <span class="n">CB_API_TOKEN</span><span class="p">,</span>
  <span class="s">'X-Chartboost-Signature'</span><span class="p">:</span> <span class="n">signature</span>
<span class="p">}</span>

<span class="c1"># Send the postback
</span><span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">CB_PIA_ENDPOINT</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</code></pre></div></div>

</li>
  
      <li>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">https</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">https</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">crypto</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">crypto</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">var</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">descriptor</span><span class="p">,</span> <span class="nx">signature</span><span class="p">,</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">req</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">CB_PIA_HOST</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">live.chartboost.com</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">CB_PIA_PATH</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">/event_service/v3/track</span><span class="dl">"</span><span class="p">;</span> 
<span class="kd">const</span> <span class="nx">CB_PIA_PORT</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">443</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">CB_API_SECRET</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{your_api_secret}}</span><span class="dl">"</span><span class="p">;</span> 
<span class="kd">const</span> <span class="nx">CB_API_TOKEN</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">{{your_api_token}}</span><span class="dl">"</span><span class="p">;</span> 


<span class="kd">var</span> <span class="nx">app_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">54ecc0535beacdc1e1eff778</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// replace this with your app id</span>
<span class="kd">var</span> <span class="nx">app_signature</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">601be68e3bb4e7eb953024eb4f2ac03376e2c2fb</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// replace this with your app signature</span>
<span class="kd">var</span> <span class="nx">gaid</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">8df6c9bf-d647-4400-bc13-7ff317f046f3</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// example Google Advertising Identifier</span>
<span class="kd">var</span> <span class="nx">ifa</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">8DF6C9BF-D647-4400-BC13-7FF317F046F4</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// example iOS Identifier for Advertising</span>
<span class="kd">var</span> <span class="nx">fire_adid</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">8df6c9bf-d647-4400-bc13-7ff317f046f5</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// exampple FireOS Advertising Identifier</span>
<span class="kd">var</span> <span class="nx">uuid</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">8df6c9bf0</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// example legacy Android ID</span>
<span class="kd">var</span> <span class="nx">product_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">bag_of_gems</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// example `product_id`</span>
<span class="kd">var</span> <span class="nx">currency</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">USD</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// example `currency` code</span>
<span class="kd">var</span> <span class="nx">price</span> <span class="o">=</span> <span class="mf">1.99</span><span class="p">;</span>  <span class="c1">// example `price`</span>
<span class="kd">var</span> <span class="nx">localized_title</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">bolsa de gemas</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// optional, used if translating product title from English to another language</span>
<span class="kd">var</span> <span class="nx">localized_description</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">un bolsa de gemas</span><span class="dl">"</span>  <span class="c1">// optional, used if translating product description from English to another language</span>


<span class="kd">function</span> <span class="nf">sendEvent</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">data</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">({</span>
        <span class="dl">"</span><span class="s2">app_id</span><span class="dl">"</span><span class="p">:</span> <span class="nx">app_id</span><span class="p">,</span> 
        <span class="dl">"</span><span class="s2">gaid</span><span class="dl">"</span><span class="p">:</span> <span class="nx">gaid</span><span class="p">,</span>
        <span class="c1">// "ifa": ifa,</span>
        <span class="c1">// "uuid": uuid,</span>
        <span class="c1">// "fire_adid": fire_adid,</span>
        <span class="dl">"</span><span class="s2">iap</span><span class="dl">"</span><span class="p">:</span> <span class="p">{</span>
            <span class="dl">"</span><span class="s2">product_id</span><span class="dl">"</span><span class="p">:</span> <span class="nx">product_id</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">currency</span><span class="dl">"</span><span class="p">:</span> <span class="nx">currency</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">price</span><span class="dl">"</span><span class="p">:</span> <span class="nx">price</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">localized_title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">localized_title</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">localized_description</span><span class="dl">"</span><span class="p">:</span> <span class="nx">localized_description</span>
        <span class="p">}</span>
    <span class="p">});</span>

    <span class="c1">// X-Chartboost-Signature is generated on every request using the following hashing algorithm </span>
    <span class="nx">descriptor</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">action:pia</span><span class="se">\n</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">CB_API_SECRET</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\n</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">app_signature</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\n</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">data</span><span class="p">;</span>
    <span class="nx">signature</span> <span class="o">=</span> <span class="nx">crypto</span><span class="p">.</span><span class="nf">createHash</span><span class="p">(</span><span class="dl">'</span><span class="s1">sha256</span><span class="dl">'</span><span class="p">).</span><span class="nf">update</span><span class="p">(</span><span class="nx">descriptor</span><span class="p">).</span><span class="nf">digest</span><span class="p">(</span><span class="dl">'</span><span class="s1">hex</span><span class="dl">'</span><span class="p">);</span>

    <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">host</span><span class="p">:</span> <span class="nx">CB_HOST</span><span class="p">,</span>
        <span class="na">port</span><span class="p">:</span> <span class="nx">CB_PORT</span><span class="p">,</span>
        <span class="na">path</span><span class="p">:</span> <span class="nx">CB_PATH</span><span class="p">,</span>
        <span class="na">method</span><span class="p">:</span> <span class="dl">'</span><span class="s1">POST</span><span class="dl">'</span><span class="p">,</span>
        <span class="na">agent</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="na">headers</span><span class="p">:</span> <span class="p">{</span>
            <span class="dl">'</span><span class="s1">Content-Type</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">application/json</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">Content-Length</span><span class="dl">'</span><span class="p">:</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">X-Chartboost-Token</span><span class="dl">'</span><span class="p">:</span> <span class="nx">CB_API_TOKEN</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">X-Chartboost-Signature</span><span class="dl">'</span><span class="p">:</span> <span class="nx">signature</span>
        <span class="p">}</span>
    <span class="p">};</span>

    <span class="c1">// Build the request using node https module</span>
    <span class="nx">req</span> <span class="o">=</span> <span class="nx">https</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">setEncoding</span><span class="p">(</span><span class="dl">'</span><span class="s1">utf8</span><span class="dl">'</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">statusCode: </span><span class="dl">"</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">);</span>
        <span class="nx">res</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Response: </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">chunk</span><span class="p">);</span>
        <span class="p">});</span>
    <span class="p">});</span>

    <span class="nx">req</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
    <span class="nx">req</span><span class="p">.</span><span class="nf">end</span><span class="p">();</span>
    <span class="nf">callback</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// Send the postback</span>
<span class="nf">sendEvent</span><span class="p">(</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">);</span>
</code></pre></div></div>

</li>
  
</ul>


> Sample Response

```json
{
  "status": 200,
  "message": "OK"
}
```

### HTTPS Request

`POST https://live.chartboost.com/event_service/v3/track`


### Authentication

To authenticate with this endpoint, you must generate a signature on each request. A string with the following template must be made, and the signature is created by taking the SHA-256 hash of the string. Note that anything contained within double curly brackets is a variable that is meant to be replaced by your server.


X-Chartboost-Signature: `sha256("action:pia\n{{CB_API_SECRET}}\n{{app_signature}}\n{{JSON body}}")`


The Chartboost app_signature is an identifier unique to each individual app in the Chartboost dashboard. Chartboost developers can find their game's app signature on the Chartboost dashboard's **App Settings** page.

The resulting digest from the hash function should be sent in the request header below.


### Headers

Header                 | Value
----                   | -----
Content-Type           | `application/json`
X-Chartboost-Token     | `{{your_api_token}}`
X-Chartboost-Signature | `{{computed signature}}`


### Request Parameters

Name          | Required | Type   | Description
----          | -------- | ----   | -----------
app_id        | true     | string | Chartboost app ID (found in the Chartboost dashboard)
ifa           | true*     | string | Apple identifier for advertising, required if iTunes Store app
gaid          | true*     | string | Google advertising identifier, required if Google Play Store app
fire_adid     | true*     | string | FireOS advertising identifier, required if Amazon Store app and available
uuid          | false    | string | Legacy Android ID, only required if `gaid` is unavailable, such as with Amazon devices
iap           | true    | object | JSON of in-app purchase details; see `IAP object requirements` section below
click_id      | false    | string | Chartboost Click ID if available
completed_view_id | false | string | Chartboost Completed View ID if available
match_type    | false     | string | Represents the method of attribution determination (e.g. fingerprinting, device ID, google referrer, etc.)

<div class="alert alert-info" role="alert">
  <ul>
<li>`gaid` should be sent for Google Play Store apps, unless only Android ID is available on the device, such as with older Amazon devices.</li>
<li>`fire_adid` should be sent for Amazon App Store apps, unless only Android ID is available on the device, such as with older Amazon devices. </li>
</ul>
</div>

#### IAP object requirements

Name                    | Required | Type   | Description
----                    | -------- | ----   | -----------
product_id              | true     | string | Unique identifier describing the purchased item
price                   | true     | float  | Price paid for the item
currency                | true     | string | 3-letter currency code.  If currency code is unavailable, set to <code>"USD"</code>.
localized_title         | false    | string | Localized name of the purchased item. 
localized_description   | false    | string | Localized description of the purchased item.


## Errors

Chartboost APIs use the following error codes:

Error Code | Meaning
---------- | -------
400 | **Bad Request** -- Your request is formatted incorrectly, contains bad values, or does not include required parameters.
403 | **Forbidden** -- You have supplied an incorrect signature or are using an invalid API token.
404 | **Not Found** -- The resource could not be found or required parameters contain bad values (invalid Click ID for example)
405 | **Method Not Allowed** -- You are using an invalid HTTP method for the resource.
500 | **Internal Server Error** -- We had a problem with our server. Try again later.
503 | **Service Unavailable** -- We're temporarily offline for maintenance. Please try again later.

If your call receives a `5xx` HTTP error code, your server should retry the request using an exponential back-off: Try again in 5 seconds, then 10 seconds, then 20 seconds, then 40 seconds, etc.. Set a max number of retries or TTL that can accommodate temporary server outages (recommended: 24 hour TTL).

### Client Setup

- Advertisers may visit the Chartboost [S2S PIA integration for in-app purchases](/en/advertising/s2stracking/in-app-purchase-tracking/) documentation.  Partners should submit a request to add documentation there for your integration.

