# Sirdata API

Sirdata APIs suite give you access to the core of Sirdata's technology and dataset right into your application.


# API Access

Getting started with Sirdata APIs

## Global API Access

{% hint style="warning" %}
Access to **Sirdata API** is granted by your sales manager. Having an **API Access** implies that both **legal** and **sales agreements** has been signed.\
\
Please contact your sales representative at **<sales@sirdata.com>** to get an access.
{% endhint %}

1. Ask a **Global API Access** to your **contact** at Sirdata
2. You will receive an **email** to register by creating your **username** and **password**

![E.g of the registration email](/files/-Lz6nReo1TtyuYkNr4Me)

3\. By clicking on the **Register** button, you will be redirected towards the **Partner API** for credentials creation

![E.g of Partner API credentials creation](/files/-Lz6oYeL58_dpZuXA5MV)

{% hint style="danger" %}
Please note that for **security** purposes, **there is no credentials recovery system** in place. If you loose your password, please **contact** Sirdata.
{% endhint %}

4\. As soon you've signed in, you access is **created** and your are ready to request **Sirdata APIs**

## Product APIs Access

{% hint style="warning" %}
Once your **Global API access** has been granted, you will be able to request specific **Product APIs access**.

Please contact your AM at **<sales@sirdata.com>** to get access to the **Product APIs** you've signed an **agreement** for.
{% endhint %}

Here is the list of all the **Product APIs** available:

* [Live Targeting API](/a-ds-api/about-live-targeting)
* [Notification API](/notification-api/about-notification-api)
* [Audience API](/customer-api/about)
* [Semantic API](https://semantic-api.docs.sirdata.io/)

## Production APIs

**Endpoint**\
<https://partner-api.sddan.com/api/v1/public>

## Sandbox APIs

**Endpoint**\
\&#xNAN;*We are working on it, it should be available shortly*\
\
You will find more infos about the [**Sandbox** ](/api-overview/sandbox)environnement into the dedicated section below

{% content-ref url="/pages/-LyUG\_FHAmUx85dEg8Bu" %}
[Sandbox](/api-overview/sandbox)
{% endcontent-ref %}


# Sandbox

Testing environment for APIs integration

*We are currently working on this Sandbox. We do our best to provide this safe environnement to test APIs integration as soon as possible.*


# API Updates

Keeping up-to-date with Sirdata AP

Please be aware that **Sirdata** may make **backwards-compatible changes** to the API at any time, including adding new optional request and response properties.

**New features** and **options** will be communicated to clients, but please ensure that your JSON serialization library will allow unknown properties to appear in the JSON response without causing an error; this is standard behavior in most JSON serialization libraries.

Should a change be required that breaks backwards compatibility, **Sirdata** will **notify clients** in advance to ensure a smooth transition.


# Get Token

Getting authentificated to request APIs

{% hint style="danger" %}
To access some **Sirdata's APIs**, you **must** generate an **authentication token.**
{% endhint %}

## Get Token

<mark style="color:blue;">`GET`</mark> `https://partner-api.sddan.com/api/v1/public/auth/partner/:id/token`

Have a look of the JSON Body **Request** and **Response**

#### Path Parameters

| Name | Type   | Description               |
| ---- | ------ | ------------------------- |
| id   | string | Your Sirdata's partner id |

#### Request Body

| Name     | Type   | Description                                            |
| -------- | ------ | ------------------------------------------------------ |
| login    | string | The user's login requesting the authentification token |
| password | string | The user's password                                    |

{% tabs %}
{% tab title="200 Example response for a valid Token creation" %}

```
{
  "token": "-njtsdfsjookdbyekkcuzoldsrl",
  "partner_id": 12345,
  "expiration_time": "2019-12-11T17:52:30.821624721+01:00"
}
```

{% endtab %}

{% tab title="400 Invalid input request" %}

```
```

{% endtab %}

{% tab title="401 Unauthorized access" %}

```
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Partner id**

Please note that your **partner id** refered as **id** into the *Path Parameters* (see below) will be provided by your Sirdata's technical AM once **API Access** has been granted.
{% endhint %}

{% hint style="success" %}
**Authentification Token created**

Once you generate the **authentication token**, we are ready to request Sirdata's APIs.\
Include the token from the **JSON response** as a **header** in all other API calls.

Below is an example of a **header** that includes the token used to make subsequent API call.
{% endhint %}

```
Authorization: -njtsdfsjookdbyekkcuzoldsrl
```

{% hint style="warning" %}
Please note that both **legal** and **sales agreements** must be signed prior, otherwise the **authentification token** won't allow access.

You can refer to the [**API Access**](/api-overview/api-access) section for more information.
{% endhint %}

{% content-ref url="/pages/-LyUGDqo2EVCjsRokWQd" %}
[API Access](/api-overview/api-access)
{% endcontent-ref %}


# Sirdata Taxonomy

Picking up the right Sirdata audience to target

You can request both **user-based** and/or **contextual** audiences throught **Sirdata Taxonomy.**

## Sirdata Taxonomy

This is our **internal taxonomy** with thousands of **segments** available and it keeps growing.

Information available for each `segment_id`

| Parameter       | Value                                                                                   |
| --------------- | --------------------------------------------------------------------------------------- |
| **id**          | *sirdata's internal segment id*                                                         |
| **name**        | name of the segment                                                                     |
| **description** | short description of the segment                                                        |
| **price**       | *CPM-based price of the segment (EUR, USD or GBP)*                                      |
| **path**        | *tiers1, tiers2, tiers3 ... of the taxonomy path*                                       |
| **data\_type**  | *type of processed data: declarative, intent, interest, modeling, location, contextual* |

{% hint style="info" %}
Please note that you must request the **sirdata id** - *refered as **id** above -* of the wanted segment you would like to target through the **Live Targeting API**
{% endhint %}

### CSV File

Access and import the whole **public taxonomy** into your system by dowloading the **CSV** below:

{% file src="/files/-Lzbx2K23a9MSqRZMdnj" %}
Sirdata Taxonomy for Categories
{% endfile %}

### Sirdata Audiences

Access any time to the whole public taxonomy **updated** in **real-time** by registering on our online platform here: [**https://audiences.sirdata.com**/](https://audiences.sirdata.com/)


# IAB Taxonomy

Picking up the right IAB audience to target

Our technology supports the **IAB Taxonomy** global standard for both **user-based** and/or **contextual** audiences.

You can find more info and download this taxonomy here: [IAB Tech Lab Content Taxonomy](https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/)

{% hint style="info" %}
Note that any call **towards our system** can be done using directly the official IAB category ID referred as **Unique ID** into the IAB Taxonomy
{% endhint %}


# 3rd Party Taxonomy

Use your own taxonomy

You can use Sirdata's **taxonomy-based** technology - *both **user-centric** or **contextual** audiences* - within your own taxonmy.

{% hint style="warning" %}
Please note that it will **require** a set up for **mapping** purpose to our **Semantic Graph**
{% endhint %}

{% hint style="danger" %}
Additionnal **set up fees** will apply. Please ask your **sales contact** at Sirdata for further information.
{% endhint %}


# About A.D.S

Formerly Live Targeting API

{% hint style="warning" %}
This **technical documentation** is given to Sirdata partners who signed both **legal** and **sales agreement** prior to get **Global API** access and specific **Product APIs** access.\
\
Check out the [**API Access**](/api-overview/api-access) section for further information.
{% endhint %}

## What is a A.D.S API integration?

A.D.S API (formerly **Live Targeting)** is a real time **API integration** between **Sirdata's cookie-based** and/or **cookieless Audience API** and/or **Contextual API** with your advertising server system (adserver, SSP...), designed to be privacy safe by avoiding personnal data external transfer and storage.

The API integration is fairly straightforward to adopt, but there are some guidelines that should be adhered to as you build this integration.

## What is the use case covered?

It allows you to **request** any Sirdata's audience in **real-time** to improve your digital advertising campaign targeting.

With V2 integration tag, A.D.S. now supports the IAB Tech Lab's [Seller Defined Audience](https://iabtechlab.com/sda/) (SDA) specification.

If you are looking to take advantage of ADS when using Prebid.js, you can install our [Real Time Data module](https://docs.prebid.org/dev-docs/modules/sirdataRtdProvider.html) directly.


# Tag integration V1

Starting with the live targeting API (decrepated)

{% tabs %}
{% tab title="Tag" %}
{% hint style="danger" %}
This API is decrepated, please consider using the [Tag integration V2](https://docs.sirdata.net/ads-api/tag-integration-v2)
{% endhint %}

Add this **tag** to you *header* or directly to the *ad placement* where you would like to access **user segment authorized**

{% hint style="danger" %}
**THIS TAG MAY ACCESS AN EXISTING COOKIE : DO NOT CALL IT UNLESS YOU PREVIOUSLY COLLECTED A VALID CONSENT TO DO SO WHENEVER REQUESTED BY LOCAL LAW**
{% endhint %}

{% hint style="warning" %}
In UE, the UK, Iceland, Liechtenstein and Norway, unless specifically and by written authorized not to, do not call the tag if you didn't previously collected a valid consent for Purposes 1 & 3 and Vendor 53 under the [IAB Europe Transparency & Consent Framework](https://iabeurope.eu/transparency-consent-framework/), and add the mandatory [***gdpr=\[gdpr\_applies\]\&gdpr\_consent=\[tc\_string\]***](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md) parameters in the URL.
{% endhint %}

Parse the **JSON** result to get the segments you need and push them into your adserver or SSP using key/value pairs.

Use *callback* to use the answer with a predefined javascript function (see *Tag Response* above)

```javascript
function callback(result){
   console.log(result); => callback here
}
var tag = document.createElement('script');
tag.src = 'https://partner-api.sddan.com/api/v1/public/user/partner/[PARTNER_ID]/segment?gdpr=[tcf_v2_gdpr_applies]&gdpr_consent=[tcf_v2_tcstring]&callback=callback';
tag.async = true;
tag.setAttribute('referrerpolicy','unsafe-url');
document.getElementsByTagName('body')[0].appendChild(tag);
```

{% hint style="info" %}
(mandatory) ***\[PARTNER\_ID]*** : *numerical value* - is given by **your contact** at Sirdata during the [API Access](/api-overview/api-access) process

(mandatory for EEA/UK users) ***gdpr** :* [TCF V2 *gdpr\_applies* parameter](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing)

(mandatory for EEA/UK users) ***gdpr\_consent** :* [TCF V2 TC String](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing)

(optional) *callback :* **callback** function name can be change
{% endhint %}
{% endtab %}

{% tab title="Tag Response" %}
{% hint style="info" %}
Tag response will call the default “callback” with user segments if requested in the call without function name (...*\&callback)*
{% endhint %}

```javascript
callback({"domain": "example.com","partner_id" : 1234,"user_segments" : [{"id":12, "name": "[Sirdata] Fashion"},{"id": 34, "name": "[Sirdata] Woman"}]})
```

{% hint style="info" %}
Tag response will call your **function name** in the resquest (...*\&callback=my\_callback*)
{% endhint %}

```javascript
my_callback({"domain": "example.com","partner_id" : 1234,"user_segments" : [{"id":12, "name": "[Sirdata] Fashion"},{"id": 34, "name": "[Sirdata] Woman"}]})
```

{% hint style="info" %}
**JSON Object Format** if no callback function is requested
{% endhint %}

```javascript
{
  "domain": "example.com",
  "partner_id": 1234,
  "user_segments": [
    {
      "id": 12,
      "name": "[Sirdata] Fashion"
    },
    {
      "id": 34,
      "name": "[Sirdata] Woman"
    }
  ]
}
```

{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**PLEASE REMBER TO HAVE YOUR DOMAIN WHITELISTED, OTHERWIZE THE TAG WILL GET NOW ANSWER**
{% endhint %}


# Tag integration V2

Live Targeting API (new API)

{% tabs %}
{% tab title="Tag" %}
{% hint style="info" %}
**Should you want to use our API for user data and/or contextual with Prebid, please consider using our official** [**Prebid Real Time Data Submodule**](https://docs.prebid.org/dev-docs/modules/sirdataRtdProvider.html)
{% endhint %}

Add this **tag** to you *header* or directly to the *ad placement* where you would like to access user segments **cookies & consent based** user-centric segments, **cookieless** and/or **contextual** categories.

{% hint style="success" %}
THIS TAG WILL **NOT** DROP OR ACCESS TO ANY COOKIE. PRIVACY CHECKS WILL BE PERFORMED BY SIRDATA, AND THE CALL MAY BE REDIRECTED TO OUR COOKIE-BASED API WHEN RELEVANT.
{% endhint %}

{% hint style="warning" %}
In UE, the UK, Iceland, Liechtenstein and Norway, unless specifically and by written authorized not to, do call this tag **ONLY** on websites working with a [TCF compliant CMP](https://iabeurope.eu/cmp-list/).

The tag will automatically perform relevant checks, but you can perform these tests on your own and earn precious milliseconds : call the tag when a valid ~~consent~~ **CHOICE** for Purposes 1 & 3 and Vendor IDs 53 (cookie-based) and/or 916 (cookieless) has been made by the user, with the mandatory [***gdpr=\[gdpr\_applies\]\&gdpr\_consent=\[tc\_string\]***](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md) parameters in the URL.
{% endhint %}

Use this script to get user-centric segments and contextual categories and use them in the callback function :

```javascript
function sddanCallback(result){
   //Do stuff here e.g. load adserver/ssp with key/value data in result
   console.log(result);
   console.log(JSON.stringify(result.segments));
   console.log(JSON.stringify(result.contextual_categories));
   console.log(JSON.stringify(result.shared_taxonomy));
}

var sddanPid = 1; //USE 1 FOR TESTS, GET YOUR OWN ID
var sddanKeyId = 1; //USE 1 FOR TESTS, GET YOUR OWN ID

var sddanTag = document.createElement('script');
var sddanUrl;
try { sddanUrl = '&url='+encodeURIComponent(window.top.location.href); } catch (e) {}
sddanTag.src = 'https://kvt.cookieless-data.com/api/v1/public/p/'+sddanPid+'/d/'+sddanKeyId+'/s?callback=sddanCallback'+sddanUrl;
sddanTag.async = true;
sddanTag.setAttribute('referrerpolicy','unsafe-url');
document.getElementsByTagName('body')[0].appendChild(sddanTag);
```

*gdpr* and *gdpr\_consent* are collected automatically, but you can earn precious milliseconds by sending them directly on the relevant endpoint like that :

```javascript
<script>
var sddanPid = 1; //USE 1 FOR TESTS, GET YOUR OWN ID
var sddanKeyId = 1; //USE 1 FOR TESTS, GET YOUR OWN ID
var sddanWaitUserChoice = true; //True if you want to wait user choice or false if not
var sddanSegments = new Object;

function sddanCallback(result){
   //Do stuff here e.g. load adserver/ssp with key/value data in result
   console.log(result);
   console.log(JSON.stringify(result.segments));
   console.log(JSON.stringify(result.contextual_categories));
   console.log(JSON.stringify(result.shared_taxonomy));
}

function getSddanTargeting(tcData,isCookiebased) {
	var sddanTag = document.createElement('script');
	var sddanHost = (isCookiebased===true?'sddan.com':'cookieless-data.com');
	var sddanTcString = (tcData?'&gdpr='+tcData.gdprApplies+'&gdpr_consent='+(tcData.tcString?tcData.tcString:''):'');
	var sddanUrl;
	try { sddanUrl = '&url='+encodeURIComponent(window.top.location.href); } catch (e) {}
	sddanTag.src = 'https://kvt.'+sddanHost+'/api/v1/public/p/'+sddanPid+'/d/'+sddanKeyId+'/s?callback=sddanCallback'+sddanUrl+sddanTcString;
	sddanTag.async = true;
	sddanTag.setAttribute('referrerpolicy','unsafe-url');
	document.getElementsByTagName('body')[0].appendChild(sddanTag);
}

(function () {
  if (typeof window.__tcfapi === 'function') {
    window.__tcfapi('addEventListener', 2, function (tcData, success) {
        if (!success || (!tcData.eventStatus && tcData.gdprApplies)) {
            return
        }
        if (!tcData.gdprApplies || (tcData.tcString && tcData.vendor.consents[53] && tcData.purpose.consents[1] && tcData.purpose.consents[4])) {
            getSddanTargeting(tcData,true);
            __tcfapi('removeEventListener', 2, function () {}, tcData.listenerId);
        }
        else if (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete" || sddanWaitUserChoice !== true) {
        	 getSddanTargeting(tcData,false);
            __tcfapi('removeEventListener', 2, function () {}, tcData.listenerId);
        }
    });
  }
  else {
  	getSddanTargeting(null,null);
  }
})();
</script>
```

| Parameter            | Value                                                                                                                                                                                                                                                                             |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ***\[PARTNER\_ID]*** | *numerical value* - is given by **your contact** at Sirdata during the [API Access](/api-overview/api-access) process (e.g. *sddanPid* in the example above) (mandatory)                                                                                                          |
| ***\[KEY\_ID]***     | *numerical value* - is given by **your contact** at Sirdata during the [API Access](/api-overview/api-access) process (e.g. *sddanKeyId* in the example above) (mandatory)                                                                                                        |
| ***gdpr***           | [TCF V2 *gdpr\_applies* parameter](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing) (mandatory for EEA/UK users) |
| ***gdpr\_consent***  | [TCF V2 TC String](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing) (mandatory for EEA/UK users)                 |
| ***callback***       | callback function name can be change (mandatory)                                                                                                                                                                                                                                  |
| {% endtab %}         |                                                                                                                                                                                                                                                                                   |

{% tab title="Tag Response" %}
{% hint style="info" %}
Tag response will call your **function name set** in the resquest (e.g. ...?*callback=*&#x73;ddanCallback&...)
{% endhint %}

```javascript
sddanCallback({
    "segments": [
        111111,
        222222
    ],
    "segtaxid": null,
    "cattaxid": null,
    "contextual_categories": {
        "333333": 100
    },
    "shared_taxonomy": {
        "27440": {
            "segments": [
                444444,
                555555
            ],
            "segtaxid": 552,
            "cattaxid": 553,
            "contextual_categories": {
                "666666": 100
            }
        }
    },
    "global_taxonomy": {
        "9998": {
            "segments": [
                123,
                234
            ],
            "segtaxid": 4,
            "cattaxid": 7,
            "contextual_categories": {
                "345": 100,
                "456": 100
            }
        },
        "9999": {
            "segments": [
                12345,
                23456
            ],
            "segtaxid": 550,
            "cattaxid": 551,
            "contextual_categories": {
                "34567": 100,
                "45678": 100
            }
        }
    }
})
```

| Name                   | Value                                                                                                                                                                                                                                                                                                |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| segments               | <p>User-based segments IDs.<br><br>Please refer to your dedicated taxonomy with private segment IDs and segtaxid if operated within SDA specification</p>                                                                                                                                            |
| contextual\_categories | <p>Context-based category IDs with relevancy score (0-100 scale from lower to higher quality).</p><p>Please refer to your dedicated taxonomy with private segment IDs and cattaxid if operated within SDA specification</p>                                                                          |
| global\_taxonomy       | <p>SDA & IAB taxonomies based & user-centric segments & Context-centric categories.</p><p>These IDs may be shared with all buyers thanks to the SDA specification.</p>                                                                                                                               |
| shared\_taxonomy       | <p>User-centric segments & Context-centric categories dedicated to a given partner when you request us to share data with him on your website.</p><p>Useless for you, the partner has his own private taxonomy.</p><p>These IDs may be shared with given buyers thanks to the SDA specification.</p> |
| {% endtab %}           |                                                                                                                                                                                                                                                                                                      |
| {% endtabs %}          |                                                                                                                                                                                                                                                                                                      |

{% hint style="danger" %}
**PLEASE REMBER TO HAVE YOUR DOMAIN(S) WHITELISTED WHEN REQUESTED PRODUCTION PARTNER ID AND KEY ID, OTHERWIZE THE TAG WILL GET NOW ANSWER**
{% endhint %}

Whenever you want to work accordingly to the SDA specification, please refer to the [official segtax ID taxonomies](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/extensions/community_extensions/segtax.md).


# Test method

Make sure your integration works properly

## To test the tag integration V2, use partner\_id 1 and key\_id 1, and check if you get this result after having given consent on the CMP :

{% tabs %}
{% tab title="Tag Response" %}

```javascript
sddanCallback({
    "segments": [111111, 222222],
    "contextual_categories": {
        "333333": 100
    },
    "shared_taxonomy": {
        "27446": {
            "segments": [444444, 555555],
            "contextual_categories": {
                "666666": 100
            }
        }
    }
})
```

{% endtab %}
{% endtabs %}

## To test both integration with valid credentials, proceed like below.

## 1) User ID creation

Go to <http://parasolchauffant.com/>, accept terms

## 2) Get encrypted user ID

Go to [https://partner-api.sddan.com/api/v1/public/user/partner/\[PARTNER\_ID\]/user](https://partner-api.sddan.com/api/v1/public/user/partner/23182/user)

![](/files/-Lzqmg0-jTBVHaDR1JDR)

{% hint style="info" %}
**Copy** the encrypted **user ID** into your clipboard (e.g see JSON response)
{% endhint %}

## 3) Force user ID into segment id

## Force user ID

<mark style="color:green;">`POST`</mark> `https://partner-api.sddan.com/api/v1/public/user/partner/:partnerId/user/segment`

Force your **user ID** into a Sirdata **segment**.\
Request body is **JSON format**

#### Path Parameters

| Name      | Type   | Description           |
| --------- | ------ | --------------------- |
| partnerId | number | Your given partner id |

#### Query Parameters

| Name   | Type   | Description                           |
| ------ | ------ | ------------------------------------- |
| userId | string | Encrypted user id obtained in step 2) |

#### Request Body

| Name     | Type  | Description                                             |
| -------- | ----- | ------------------------------------------------------- |
| segments | array | List of segment ids you like to force your user ID into |

{% tabs %}
{% tab title="202 User ID is into segment ID 33 and 73" %}

```javascript
curl --request POST \
  --url 'https://partner-api.sddan.com/api/v1/public/user/partner/123/user/segment?userId=NThhOGZiZGE2OGFkNjQ1ZjU0ZWExOTU0u236m6%2BlAqZlUpo%2F1%2BQfCz8323YeNtOs4aV8PUduK3jCEXvsQQWnGgo4aUGW9Gcb0Y0ob5QrXXXX' \
  --header 'content-type: application/json' \
  --data '{
	"segments": [33,73]
}'
```

{% endtab %}

{% tab title="400 " %}

```
```

{% endtab %}

{% tab title="500 " %}

```
```

{% endtab %}
{% endtabs %}


# Segment Access

Request segment access for your ad campaign

## 1) Whitelist your domain

You must **provide** to your contact at Sirdata the **main domain** from where you will proceed API calls.

{% hint style="danger" %}
Without **whitelisted** your domain **prior**, you won't be able **to** **access** Sirdata segments
{% endhint %}

{% hint style="info" %}
Please note that whitelisting your **main domain** API calls can be done from all **subdomains** as well. E.g **sirdata.com** and **api.sirdata.com**
{% endhint %}

## 2) Resquest segment access

**Ask your contact** at Sirdata to **give access** to the needed segments by providing the Sirdata **segment IDs**.

Please refer to the **Taxonomy** section below to find the right **segments** and **IDs** associated:

{% content-ref url="/pages/-LzbmcXaszhstMsLSQk2" %}
[Sirdata Taxonomy](/taxonomy/sirdata-taxonomy)
{% endcontent-ref %}

{% hint style="warning" %}
Please not that your **contract** might **limit the number of segments** you are allowed to **access** at the same time on a monthly basis.
{% endhint %}

## 3) Access confirmation

As soon as you contact confirm the segments access, you are ready to request the Live Targeting API for these specifics segments.

{% hint style="info" %}
Any **modification** - *deletion and/or addition* - on the list of **segment** authorized **must be asked** to your contact at Sirdata
{% endhint %}


# About Notification API

Learning about the Notification API

### Swagger API file

{% file src="/files/-LvpWNvCDSHbnR6447\_2" %}
Swagger API File
{% endfile %}

## What is a notification API integration?

A **Notification API** integration is a direct API integration between Sirdata's **Identity Graph** and your **customers database** hosted into your prefered marketing campaign tools.

## What is the use case covered?

It allows you to onboard your database and receive **real-time notifications** when **your customer** has an **online activity** in order to **trigger** your direct marketing campaign just at the **right time**.

It allows you to operate **retargeting campaigns** right from your direct maketing tool - *email, app notifications, sms, call center -* just by uploading your **customers data** who have recently **visited your website**.


# Audience

## Get audience list

<mark style="color:blue;">`GET`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/audience`

Get token

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

{% tabs %}
{% tab title="200 Cake successfully retrieved." %}

```
[
  {
    "id": "xxxxxxx-e8ad-4f53-9234-2fca87fe9d86",
    "id_partner": 12345,
    "name": "My Audience",
    "type": "EMAIL_HASH",
    "status": "UPLOADING",
    "last_update": "2019-07-29 12:50:38"
  }
]
```

{% endtab %}
{% endtabs %}

## Get audience

<mark style="color:blue;">`GET`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/audience/:id`

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
| id   | string | audience id |

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

{% tabs %}
{% tab title="200 " %}

```
  {
    "id": "xxxxxxx-e8ad-4f53-9234-2fca87fe9d86",
    "id_partner": 12345,
    "name": "My Audience",
    "type": "EMAIL_HASH",
    "status": "UPLOADING",
    "last_update": "2019-07-29 12:50:38"
  }
```

{% endtab %}

{% tab title="404 audience id not found" %}

```
```

{% endtab %}
{% endtabs %}

## Create audience

<mark style="color:green;">`POST`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/audience`

Post csv (comma separator) with 3 columns :\
\- hash type : hd\_m (md5) or hd\_s256 (sha 256)\
\- hash value\
\- reference id

#### Headers

| Name          | Type   | Description   |
| ------------- | ------ | ------------- |
| name          | string | audience name |
| Authorization | string | token         |

{% tabs %}
{% tab title="200 " %}

```
  {
    "id": "xxxxxxx-e8ad-4f53-9234-2fca87fe9d86",
    "id_partner": 12345,
    "name": "My Audience",
    "type": "EMAIL_HASH",
    "status": "UPLOADING",
    "last_update": "2019-07-29 12:50:38"
  }
```

{% endtab %}

{% tab title="400 " %}

```
```

{% endtab %}
{% endtabs %}


# Campaign

## Campaign list

<mark style="color:blue;">`GET`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/campaign`

Get campaign list

#### Query Parameters

| Name | Type   | Description                                 |
| ---- | ------ | ------------------------------------------- |
| size | number | number of maximum campaign returned by call |
| page | number |                                             |

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

{% tabs %}
{% tab title="200 " %}

```
[
    {
      "id": "xxxxxxx-2feb-481a-9910-6d71dc337b00",
      "id_audience": "xxxxxx-6e58-4db7-8ada-53b7bace6da4",
      "id_partner": 12345,
      "name": "My first campaign",
      "notify_method": "WEBHOOK",
      "devices": [
        "DESKTOP",
        "MOBILE"
      ],
      "event": [
        "ONLINE"
      ],
      "map_value_types": [
        "EMAIL_HASH"
      ],
      "active": true,
      "start": "2019-07-25T17:09:41.32419522+02:00",
      "end": "2019-09-30T00:09:41.32419522+02:00",
      "max_event_age_in_second": 300,
      "max_notifying_per_id": 1000,
      "delay_before_notify_same_id_in_second": 3600,
      "webhook_endpoint": "https://my-endpoint.com/api/v1/endpoint",
      "capping_notify_per_minute": null,
      "status_endpoint": null,
      "filter_partner_audience": true,
      "ready_for_activation": true,
      "uploaded_ids": 0
    }
]
```

{% endtab %}

{% tab title="404 Could not find a cake matching this query." %}

```
```

{% endtab %}
{% endtabs %}

## Campaign

<mark style="color:blue;">`GET`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/campaign/:id`

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
| id   | string | campaign id |

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

{% tabs %}
{% tab title="200 " %}

```
    {
      "id": "xxxxxxx-2feb-481a-9910-6d71dc337b00",
      "id_audience": "xxxxxx-6e58-4db7-8ada-53b7bace6da4",
      "id_partner": 12345,
      "name": "My first campaign",
      "notify_method": "WEBHOOK",
      "devices": [
        "DESKTOP",
        "MOBILE"
      ],
      "event": [
        "ONLINE"
      ],
      "map_value_types": [
        "EMAIL_HASH"
      ],
      "active": true,
      "start": "2019-07-25T17:09:41.32419522+02:00",
      "end": "2019-09-30T00:09:41.32419522+02:00",
      "max_event_age_in_second": 300,
      "max_notifying_per_id": 1000,
      "delay_before_notify_same_id_in_second": 3600,
      "webhook_endpoint": "https://my-endpoint.com/api/v1/endpoint",
      "capping_notify_per_minute": null,
      "status_endpoint": null,
      "filter_partner_audience": true,
      "ready_for_activation": true,
      "uploaded_ids": 0
    }
```

{% endtab %}

{% tab title="404 " %}

```
```

{% endtab %}
{% endtabs %}

## Create campaign

<mark style="color:green;">`POST`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/campaign`

JSON body

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

#### Request Body

| Name                                        | Type    | Description                                                                       |
| ------------------------------------------- | ------- | --------------------------------------------------------------------------------- |
| filter\_partner\_audience                   | boolean | should used only traffic linked to partner id?                                    |
| ready\_for\_activation                      | boolean | is campaign should start?                                                         |
| status\_endpoint                            | string  | if precise, notify service will call this URL to check if notifying must continue |
| capping\_notify\_per\_minute                | number  | max number of notify sent by minute                                               |
| webhook\_endpoint                           | string  | url called by service to notify                                                   |
| delay\_before\_notify\_same\_id\_in\_second | number  |                                                                                   |
| max\_notifying\_per\_id                     | number  | max notification by hash (or reference id if used in upload)                      |
| max\_event\_age\_in\_second                 | number  | max event age in second before notification                                       |
| end                                         | string  | <p>end time, example :<br>2019-10-01T00:09:41.32419522+02:00</p>                  |
| start                                       | string  | <p>start time, example :<br>2019-07-25T17:09:41.32419522+02:00</p>                |
| map\_value\_types                           | string  | \["EMAIL\_HASH"]                                                                  |
| event                                       | array   | \["ONLINE"]                                                                       |
| devices                                     | array   | \["DESKTOP","MOBILE"]                                                             |
| notify\_method                              | string  | only value for now : WEBHOOK                                                      |
| name                                        | string  | campaign name                                                                     |
| id\_audience                                | string  | audience id                                                                       |

{% tabs %}
{% tab title="200 " %}

```
    {
      "id": "xxxxxxx-2feb-481a-9910-6d71dc337b00",
      "id_audience": "xxxxxx-6e58-4db7-8ada-53b7bace6da4",
      "id_partner": 12345,
      "name": "My first campaign",
      "notify_method": "WEBHOOK",
      "devices": [
        "DESKTOP",
        "MOBILE"
      ],
      "event": [
        "ONLINE"
      ],
      "map_value_types": [
        "EMAIL_HASH"
      ],
      "active": true,
      "start": "2019-07-25T17:09:41.32419522+02:00",
      "end": "2019-09-30T00:09:41.32419522+02:00",
      "max_event_age_in_second": 300,
      "max_notifying_per_id": 1000,
      "delay_before_notify_same_id_in_second": 3600,
      "webhook_endpoint": "https://my-endpoint.com/api/v1/endpoint",
      "capping_notify_per_minute": null,
      "status_endpoint": null,
      "filter_partner_audience": true,
      "ready_for_activation": true,
      "uploaded_ids": 0
    }
```

{% endtab %}

{% tab title="400 " %}

```
```

{% endtab %}
{% endtabs %}

## Update campaign

<mark style="color:orange;">`PUT`</mark> `https://partner-api.sddan.com/api/v1/public/event-notify/campaign/:id`

Use same parameters as create campaign

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
| id   | string | campaign id |

#### Headers

| Name          | Type   | Description |
| ------------- | ------ | ----------- |
| Authorization | string | token       |

{% tabs %}
{% tab title="200 " %}

```
    {
      "id": "xxxxxxx-2feb-481a-9910-6d71dc337b00",
      "id_audience": "xxxxxx-6e58-4db7-8ada-53b7bace6da4",
      "id_partner": 12345,
      "name": "My first campaign",
      "notify_method": "WEBHOOK",
      "devices": [
        "DESKTOP",
        "MOBILE"
      ],
      "event": [
        "ONLINE"
      ],
      "map_value_types": [
        "EMAIL_HASH"
      ],
      "active": true,
      "start": "2019-07-25T17:09:41.32419522+02:00",
      "end": "2019-09-30T00:09:41.32419522+02:00",
      "max_event_age_in_second": 300,
      "max_notifying_per_id": 1000,
      "delay_before_notify_same_id_in_second": 3600,
      "webhook_endpoint": "https://my-endpoint.com/api/v1/endpoint",
      "capping_notify_per_minute": null,
      "status_endpoint": null,
      "filter_partner_audience": true,
      "ready_for_activation": true,
      "uploaded_ids": 0
    }
```

{% endtab %}

{% tab title="302 " %}

```
```

{% endtab %}

{% tab title="404 " %}

```
```

{% endtab %}
{% endtabs %}


# Webhook endpoint

## Placeholders

When you create a campaign you must define a property webhook\_endpoint.\
This endpoint in an https url that can contains placeholder

* `[CAMPAIGN_ID]`
* `[AUDIENCE_ID]`
* `[CAMPAIGN_NAME]`
* `[REFERENCE_ID]`
* `[TIMESTAMP]`

All placeholders exists with an ENC\_ name for url encoded values.\
**Example :**\
`https://endpoint.company.com/api/v1/endpoint_notify/campaign/[CAMPAIGN_ID]`<br>

## Body notification

You may have to pass some custom data on your network and get them back in your endpoint.

{% hint style="warning" %}
In the UE, the UK, Iceland, Liechtenstein and Norway, unless specifically and by written authorized not to, do not call the tag if you didn't previously collected a valid consent for Purposes 1 & 3 and Vendor 53 under the [IAB Europe Transparency & Consent Framework](https://iabeurope.eu/transparency-consent-framework/), and add the mandatory [***gdpr=\[gdpr\_applies\]\&gdpr\_consent=\[tc\_string\]***](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md) parameters in the URL.
{% endhint %}

{% hint style="danger" %}
**TAG WILL ACCESS A COOKIE : DO NOT CALL IT UNLESS YOU PREVIOUSLY COLLECTED A VALID CONSENT TO DO SO WHENEVER REQUESTED BY LOCAL LAW**
{% endhint %}

Add this pixel in your network :

[`https://js.sddan.com/PMAP.d?pa=[PARTNER_ID]&gdpr=[gdpr_applies]&gdpr_consent=[CONSENT_STRING]`](https://js.sddan.com/PMAP.d?pa=\[PARTNER_ID]\&gdpr_consent=\[CONSENT_STRING])`&`**`args_myfirstarg`**`=XXXX&`**`args_mysecondarg`**`=YYYYY`

{% hint style="info" %}
(mandatory) ***\[PARTNER\_ID]*** : *numerical value* - is given by **your contact** at Sirdata

(mandatory for EEA/UK users) ***gdpr** :* [TCF V2 *gdpr\_applies* parameter](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing)

(mandatory for EEA/UK users) ***gdpr\_consent** :* [TCF V2 TC String](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#full-tc-string-passing)
{% endhint %}

When you create your campaign you must precise **filter\_partner\_audience: true**.

In the JSON body notification you will receive this object `:`

```javascript
{
    campaign_id: "MY_CAMPAIGN_ID",
    audience_id: "MY_AUDIENCE_ID",
    value: "MD5 OR REFERENCE_ID",
    campaign_name: "MY_CAMPAIGN_NAME",
    arguments: {
        myfirstarg: "XXXX",
        mysecondarg: "YYYYY"
    }
}
```


# About Customer API

Customer API allows audience upload to retrieve audience segments from your data (hashed emails, external ids...)

Open API specs are available here: <https://openapi.sirdata.io/customer>

1. Create a Storage containing your hashes
2. Create a Filter to target what kind of audience you want
3. Create an Order via the Filter to extract exactly your needs
4. Wait until Order is validated to download results


# Create storage

Upload your database

{% hint style="warning" %}
In dev contact please avoid to create multiple Storage with 10000 lines maximum
{% endhint %}

API Reference: <https://openapi.sirdata.io/customer/#tag/storage/paths/~1customer~1storage/post>

A Storage can be created using an multipart POST

```javascript
const form = new FormData();
form.append("name", "my first storage");
form.append("content_type", "text/csv");
// csv separator
form.append("csv_separator", ",");
// column name inside the file
form.append("csv_column_names", "[\"SHA256\",\"POSTAL_CODE\"]");
form.append("file", "/path/to/file");
// indicate if csv contains a header to remove
form.append("csv_has_header", "1");
// indicate column position containing the hash (position start at 1, index at 0)
form.append("csv_mapping_column_position", "1");

fetch("https://gateway.sirdata.io/api/v1/public/customer/storage?=", {
  "method": "POST",
  "headers": {
    "x-api-token": "XXXXX-XXXXX-XXXXX-XXXXX",
    "content-type": "multipart/form-data; boundary=---011000010111000001101001"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
```

Check the status code, if 200 then it's ok.\
Now you must iterate on Storage to obtains the loading status until you got OK or ERROR.

Get Storage data (and status) <https://openapi.sirdata.io/customer/#tag/storage/paths/~1customer~1storage~1{id}/get>\
If status is OK you will have some important information on your storage.\
For example in table\_intersect.segment.distinct\_mapping\_column\_values you can see the unique hash count Sirdata has data on.\
\
When this part is done you'll be able to create a Filter, allowing you to get statistics on selected segments for your Storage, keep Storage id.


# Create Filter (counting)

```javascript
let storageId = 123
let filter = {
  name:"my first filter",
  type :"SEGMENT",
  dimension_indexes:[1], // add column index 1 (postal code in example) in the stats file
  column_filter:[ // filter on column value
    {
    column_index:1, // index 1, postal code in example
    values:["54","67","57","68"], // postal code must start with this values
    operator:"PREFIX" // indicate type of filter: EQUAL,PREFIX etc, see reference
    not:false // if true reverse the condition (here, must not start with selected values)
    }
  ]
  segment_filter:{
    segment: [{id:456}, {id:789}], // count for hash in segment 456 or 789
  }
}
fetch("https://gateway.sirdata.io/api/v1/public/customer/storage/"+storageId+"/filter?=", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "x-api-token": "XXXXX-XXXXX-XXXXX-XXXXX",
  },
  "body": JSON.stringify(filter)
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
```

If response status code is 202 then proceed to get filter object each x seconds to check status until ERROR or OK

### Get filter segments stats

Reference: <https://openapi.sirdata.io/customer/#tag/filter/paths/~1customer~1storage~1{id}~1filter~1{filterId}~1counting/get>

```javascript
let storageId = 123;
let filterId = 456;

fetch("https://gateway.sirdata.io/api/v1/public/customer/storage/"+storageId+"/filter/"+filterId+"/counting?=", {
  "method": "GET",
  "headers": {
    "x-api-token": "XXXXX-XXXXX-XXXXX-XXXXX",
  },
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
```

Example of CSV stats

```csv
segment_name,segment_id,count
Sirdata [Interest] Ecology & Environment,14,375921
Sirdata [Interest] Auto & Vehicles > Electric Cars,1293,88115
Sirdata [Intent] Life Events > Home Movers,578,52699
Sirdata [Inferred] Life Events > Home Movers,2381,51828
Sirdata [Intent] Auto & Vehicles > Electric Cars,599,38929

```


# Create order

When a filter satisfy your need you can create an Order.\
If you have a rate card associated to your account the status will be automatically set as ACCEPTED when the Order is ready, WAITING\_VALIDATION otherwise to be updated be your sales contact.\
\
**Steps:**

1. Create an order :<https://openapi.sirdata.io/customer/#tag/order/paths/~1customer~1storage~1{id}~1filter~1{filterId}~1order/post>
2. Get Order status until status is ACCEPTED (limit 1 request per minute maximum) <https://openapi.sirdata.io/customer/#tag/order/paths/~1customer~1order~1{id}/get>
3. Get Order segments statistics
4. Download accepted Order <https://openapi.sirdata.io/customer/#tag/order/paths/~1customer~1order~1{orderId}~1data/get>

```javascript
let orderRequest = {
  "comment": "my first order",
  "limit": 2000,
  "limit_per_column": {
    "column_index": 4,
    "limits": {
      "01": 30,
      "05": 50
    }
  } 
}
let storageId = 123;
let filterId = 456;

fetch("https://gateway.sirdata.io/api/v1/public/customer/storage/"+storageId+"/filter/"+filterId+"/order", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "x-api-token": "XXXXX-XXXXX-XXXXX-XXXXX",
  },
  "body": JSON.stringify(orderRequest)
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
```

If a limit per column has been set you can retrieve the volume per value limit using the Get Order <https://openapi.sirdata.io/customer/#tag/order/paths/~1customer~1order~1{id}/get>\
Property table.volume\_*per*\_*limit* contains volume by values.\
table.row\_count is the total volume


# Segment list

You can get all segments you have access to using this call <https://openapi.sirdata.io/customer/#tag/segment>

```javascript
fetch("https://gateway.sirdata.io/api/v1/public/customer/segment", {
  "method": "GET",
  "headers": {
    "x-api-token": "XXXXX-XXXXX-XXXXX-XXXXX",
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});java
```


# Sirdata API SLA

**SIRDATA SERVICE LEVEL AGREEMENT (“SLA”)**

This Service Level Agreement (“SLA”) represents the Service commitments (“Service”) between Sirdata and the Sirdata client (“Client”) regarding access to Sirdata’s products and services, including but not limited to Global API access and specific Product or Services APIs.

### 1. Definitions

The following terms, when used in this document with an initial capital letter, shall have the meanings ascribed to them below, unless otherwise specified.

**Agreement**: refers to the present Service Level Agreement.

**Anomaly**: refers to any unexpected issue causing disruption, malfunction, or deviation in Service Availability, as reported by the Client or detected by Sirdata.

Anomalies are categorized based on their impact on Service Availability and Service delivery, and assigned corresponding **Priority Levels (P1, P2, P3, P4) (“Incidents”)** as follows:

**(i) P1 (Critical) – Blocking Anomaly**: An Incident that critically impacts the Service Availability, rendering the Services completely unavailable or unusable by the Client. This corresponds to a complete Service outage (100%), requiring immediate attention.

**(ii) P2 (Significant) – Major Anomaly**: An Incident that significantly disrupts Service Availability or Service functionality, affecting 5% or more of Service requests, but where partial or alternative use of the Services remains possible.

**(iii) P3 (Moderate) – Minor Anomaly**: An Incident that causes a limited impact on Service Availability or functionality, affecting 1% or more of Service requests, but without preventing the Client from using the Services as intended.

**(iv) P4 (Minor) – Localized Issue**: An Incident that causes a localized or isolated issue without any significant impact on Service Availability, performance, or functionality. These issues do not affect the overall usability of the Services and are often related to specific user environments or configurations.

**Assistance**: refers to the support services provided by Sirdata to help the Client use the Product or Service effectively.

**API (Application Programming Interface)**: refers to a set of rules, protocols, and tools that allow different software applications or systems to communicate and interact with each other. It defines the methods and data formats that applications can use to request and exchange information.

**Downtime**: refers to any period where the Service or Product is unavailable to the Client, as per the Uptime Guarantee definitions.

**Downtime Issue or Incident**: refers to any event or condition during which a Service or product provided by Sirdata is unavailable or fails to perform as intended, as defined in the applicable uptime guarantees. This includes, but is not limited to, Service interruptions, degraded performance exceeding defined thresholds, or the inability to access specific features or functionalities of the Service.

**Emergency Maintenance**: refers to unplanned maintenance activities deemed necessary by Sirdata to address critical issues related to security, stability, or performance. Emergency maintenance may be performed without.

**Global API**: refers to a centralized application programming interface provided by Sirdata, granting the Sirdata Client access to a comprehensive range of Sirdata's core Services and functionalities in a unified manner.

**Guaranteed Response Time** (“**GRT**”): refers to the target time within which Sirdata will respond to an Incident report, not necessarily restoring the Service.

**Maintenance Periods**: refers to any Scheduled maintenance (with at least 7 days’ prior notice) and Emergency maintenance for security or performance reasons are excluded from the uptime calculations.

**Interface Response Time**: refers to the average duration between the moment a user initiates a request through Sirdata's user interface and the moment the system delivers the first byte of the response. Sirdata guarantees an average Interface Response Time of 5 seconds for all Users located in France, subject to conditions such as network stability and the user’s technical environment.

**Product APIs or Service APIs**: refers to a specialized application programming interface designed by Sirdata to enable the Sirdata Client to access specific functionalities or Services tailored to individual products offered by Sirdata.

**Recognition**: refers to the express and written acknowledgment by Sirdata of the existence of said Downtime following a thorough analysis. Such recognition can only be granted after Sirdata has conducted a comprehensive review, including an assessment of the information provided by the Client, as well as logs and other relevant technical data. Any lack of response from Sirdata to a Downtime notification shall not be construed as implicit recognition of the Downtime.

**Restoration Time Guarantee** (“**RTG**”): refers to the maximum time allocated for Service restoration based on Incident severity.

**Response Time**: refers to the duration it takes for a system or Service to process a request and provide a response. It is typically measured from the moment a request is sent (e.g., by a user, application, or device) to the moment a response is received.

**Service Availability**: refers to the percentage of time during a defined period in which Sirdata's Services are operational and accessible to users as intended, excluding periods of Scheduled Maintenance, Emergency Maintenance, or any downtime caused by factors outside Sirdata’s reasonable control, such as force majeure events or issues attributable to the Client’s technical environment.

**Service Credit**: refers to a percentage of credit reimbursed for Service non-Availability.

**Scheduled Maintenance**: refers to planned maintenance activities conducted by Sirdata to improve, update, or maintain the functionality and performance of its Services. Clients will be provided with at least seven (7) days’ prior notice for such activities. In exceptional circumstances where this notice period cannot be met due to unforeseen technical or operational constraints, Sirdata will notify the Client as soon as reasonably practicable, including the reasons for the shortened notice period.

**Uptime Guarantee**: refers to Sirdata’s commitment to ensure the percentage of time of Service Availability on a monthly basis, as defined in Section 2, excluding any periods of Scheduled Maintenance, Emergency Maintenance, or events outside Sirdata’s reasonable control, as defined in Section 7.

### 2. Service Availability and Uptime Guarantee

Sirdata guarantees an average Interface Response Time of 5 seconds for all users located in France, provided that network stability and the user’s technical environment meet the required conditions.

Sirdata commits to ensuring the availability of the following Services with distinct uptime targets, calculated monthly:

<table data-header-hidden><thead><tr><th valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top">Products/Services</td><td valign="top">Uptime Guarantee</td><td valign="top">Definition of Downtime</td></tr><tr><td valign="top">Analytics Helper / sGTM</td><td valign="top">99%</td><td valign="top">Downtime occurs if the HTTP response status is not 2xx while the Service is correctly configured.</td></tr><tr><td valign="top">ADS Live-Targeting</td><td valign="top">95%</td><td valign="top">Downtime occurs if the HTTP response is not 2xx or if Response Time exceeds 10 seconds for 5% of requests.</td></tr><tr><td valign="top">CMP</td><td valign="top">98%</td><td valign="top">Downtime occurs if the HTTP status is not 2xx or Response Time exceeds 10 seconds for 5% of requests, or if the CMP UI is not displayed correctly on the Client’s website provided that the configurations have been made by the Client.</td></tr></tbody></table>

### 3. Downtime and Downtime Issue Notification

**Downtime Issue reporting obligations:**

Clients must report Downtime Issues, within 24 hours from their detection by email to <tech@sirdata.fr> or through the user interface. Each notification must include:

(i) The name of the organization and the contact details of the reporting individual;

(ii) Summary of the Downtime Issue, including its urgency level; and

(iii) Any relevant information to facilitate a prompt resolution.

Sirdata will only process Downtime Issues if the Client complies with this procedure.

Sirdata will keep the Client informed of the progress of major or critical Incidents (P1 and P2) once the Recognition of Sirdata is acknowledged. Updates on Incident resolution will be provided based on Sirdata's technical availability and priorities.

Incident reports will only be provided upon the Client’s request and are subject to additional fees.

**Eligibility Conditions for Service Credits:**

Only Incidents reported within 24 hours of detection will be eligible for Service Credits. Detection is defined as the moment the Client becomes aware of the Incident through monitoring tools, automated alerts, or manual observations. To be eligible for Service Credits, the Client must notify Sirdata of the Incident within this timeframe, provide sufficient and verifiable evidence, and obtain Sirdata's acknowledgment that the Incident falls under its responsibility.

Interruptions caused by third-party providers, external network issues, or actions attributable to the Client do not qualify for Service Credits. Exceptions may apply if the Client demonstrates, with supporting evidence, that the delay in notification was due to circumstances beyond their reasonable control, such as force majeure events, unforeseen technical failures, or third-party disruptions

The Client must provide within 24 hours any information requested by Sirdata to diagnose and resolve the Incident.

The Client is responsible for implementing reasonable monitoring measures to detect Incidents affecting Sirdata’s Services. Detection refers to the moment the Client becomes reasonably aware of an Incident through its systems, personnel, or automated monitoring tools.

For a Service Credit request to be valid, the Client must submit supporting evidence, including logs, alerts, or other documentation demonstrating when and how the Incident was detected.

Sirdata reserves the right to verify the detection notification against its own system logs and monitoring data. Reasonable detection refers to the timeframe within which a diligent Client could have been expected to identify the Incident under normal operating conditions. Failure to meet these requirements may result in the denial of the request.

The Client is required to provide timely and complete responses to all requests for information necessary to diagnose and resolve the Incident. Failure to do so, including delays or incomplete submissions, may result in the denial or reduction of eligibility for Service Credits.

Relevant information may include, but is not limited to, system logs, alerts, error messages, configuration details, or any other technical data needed by Sirdata to verify the occurrence, assess the impact, and determine the resolution of the Incident.

Any unreasonable delays or omissions by the Client that hinder the resolution process will release Sirdata from its obligations to provide Service Credits related to the Incident.

Failure to provide the requested information within the stipulated timeframe will extend the resolution period by the duration of the delay caused by the Client.

Sirdata reserves the right to reduce the Service Credits proportionally based on the Client's contribution to the delay. If the Client fails to provide sufficient information to verify or resolve the Incident, Service Credits may be denied entirely.

### 4. Response Time and Restoration Time Guarantee (RTG)

Sirdata will use its best efforts to address Incidents within the following timelines.

<table data-header-hidden><thead><tr><th width="146" valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th><th width="121" valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top">Priority Level</td><td valign="top">Type of Anomaly</td><td valign="top">Description / Diagnosis</td><td valign="top">Guaranteed Response Time</td><td valign="top">Workaround Solution</td><td valign="top">Resolution Time</td></tr><tr><td valign="top">P1 (Critical)</td><td valign="top"><p>Blocking</p><p>Anomaly</p></td><td valign="top">Complete Availability outage (100%)</td><td valign="top">6 hours</td><td valign="top">1 day</td><td valign="top">3 days</td></tr><tr><td valign="top">P2 (Significant)</td><td valign="top"><p>Major</p><p>Anomaly</p></td><td valign="top">Service Availability is partially down, at least 5% of the traffic or response time superior to 10 seconds for ADS or CMP</td><td valign="top">12 hours</td><td valign="top">3 days</td><td valign="top">7 days</td></tr><tr><td valign="top">P3 (Moderate)</td><td valign="top"><p>Minor</p><p>Anomaly</p></td><td valign="top">Service Availability partially down, at least 1% of the traffic or response time superior to 3 seconds for ADS or CMP</td><td valign="top">3 days</td><td valign="top">14 days</td><td valign="top">28 days</td></tr><tr><td valign="top">P4 (Minimal)</td><td valign="top">Localized Issues</td><td valign="top">No significant impact on the Service Availability</td><td valign="top">7 days</td><td valign="top">N/A</td><td valign="top">N/A</td></tr></tbody></table>

Response and Restoration Time Guarantees may be extended if delays result from the Client’s failure to fulfill their cooperation obligations.

The timelines mentioned in this SLA are provided for informational purposes and may vary depending on technical constraints, resource availability, and the severity of the Incident. Sirdata will endeavor to meet these timelines to the extent possible but cannot guarantee compliance in all circumstances. In the event of a delay, Sirdata commits to promptly notifying the Client and providing regular updates on the corrective measures being implemented.

### 5. Service Credits

In the event Sirdata fails to meet the Uptime Guarantee, the following Service Credits may apply:

<table data-header-hidden><thead><tr><th valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top">Product/Service</td><td valign="top">Uptime Range</td><td valign="top">Service Credit</td></tr><tr><td valign="top"></td><td valign="top">99% or above</td><td valign="top">No Service credit</td></tr><tr><td valign="top"></td><td valign="top">95% - 99%</td><td valign="top">10% of the monthly fees</td></tr><tr><td valign="top">Analytics Helper / sGTM</td><td valign="top">90% - 95%</td><td valign="top">25% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">Below 90%</td><td valign="top">50% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">95% or above</td><td valign="top">No Service credit</td></tr><tr><td valign="top">ADS Live-Targeting</td><td valign="top">90% - 95%</td><td valign="top">10% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">Below 90%</td><td valign="top">25% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">95% or above</td><td valign="top">No Service credit</td></tr><tr><td valign="top">Auth Audience</td><td valign="top">90% - 95%</td><td valign="top">10% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">Below 90%</td><td valign="top">25% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">98% or above</td><td valign="top">No Service credit</td></tr><tr><td valign="top"></td><td valign="top">95% - 98%</td><td valign="top">10% of the monthly fees</td></tr><tr><td valign="top">CMP</td><td valign="top">90% - 95%</td><td valign="top">25% of the monthly fees</td></tr><tr><td valign="top"></td><td valign="top">Below 90%</td><td valign="top">50% of the monthly fees</td></tr></tbody></table>

Service Credits are calculated as a percentage of the monthly fees for the affected Services.

Requests for Service Credits must be submitted in writing within 15 calendar days of the Recognition of Downtime by Sirdata. Any lack of response from Sirdata to a Downtime notification shall not be construed as implicit recognition of the Downtime.

Failure to submit a Service Credit request within the specified timeframe, or to provide sufficient evidence supporting the claim, may result in the denial of the request.

Service Credits, once approved, shall be issued, invoiced, and applied within thirty (30) days from the date of recognition of the Downtime by Sirdata.

Service Credits represent the sole and exclusive remedy for Sirdata’s failure to meet the Service level commitments defined in this SLA.

The issuance of Service Credits does not constitute an admission of liability or fault by Sirdata.

### 6. Client Responsibilities

The Client is responsible for:

(i) Accurate Configuration: Ensuring the accurate configuration and integration of Sirdata’s Services or Products in strict accordance with the guidelines, documentation, and instructions provided by Sirdata.

(ii) Access and Cooperation: Granting Sirdata the necessary access, privileges, and resources, and providing any requested information within 24 hours of Sirdata’s request to enable effective diagnosis and resolution of issues.

(iii) Anomaly Reporting: Promptly recording, documenting, and reporting any system anomalies or error messages encountered while using Sirdata’s Services to facilitate the diagnostic and troubleshooting process.

(iv) Security Measures: Implementing and maintaining robust security measures, including but not limited to firewalls, antivirus systems, access controls, and regular updates, to safeguard their systems and ensure the secure operation of Sirdata’s Services.

\
Failure to meet these responsibilities will result in the following:

(i) Sirdata will be released from any related performance obligations, including those under Service Level Agreements.

(ii) Any delays, Service interruptions, or performance degradation directly or indirectly caused by such failures will not qualify for Service Credits or other remedies.

(iii) Non-compliance with Sirdata’s technical recommendations may void any applicable Service Availability commitments or Uptime Guarantee.

The Client undertakes that Sirdata’s ability to deliver the contracted Services depends on the Client fulfilling these responsibilities in a timely and accurate manner.

### 7. Exclusions

The following events are beyond Sirdata’s control and are therefore excluded from the calculation of Service Credits and downtime:

(i) Scheduled maintenance or Emergency Maintenance, provided that appropriate notice is given.

(ii) Force majeure events, including but not limited to natural disasters (e.g., earthquakes, floods), regulatory mandates, strikes, or pandemics.

(iii) Failures or issues caused by third parties, such as the Client’s third-party providers, external networks, or incompatible software versions.

(iv) Client-related causes, including misconfigurations or delays in cooperating with Sirdata during troubleshooting efforts.

These exemptions specifically encompass the events described above, but are not limited to such events.

The following events are beyond Sirdata’s control and are excluded from Service Credits and Downtime calculations.

Sirdata shall not be held liable for any delays, interruptions, or performance degradations caused by these events, and such occurrences will not be counted against Service Availability commitments.

### 8. Escalation Process

If the Client is dissatisfied with the handling or resolution of an Incident, they may submit a written complaint to Sirdata’s senior management for review at the following e-mail address: <contact@sirdata.com>.

Sirdata will evaluate and respond to escalations after considering all relevant facts provided by the Client. Such escalations do not grant an entitlement to additional Service Credits or compensation unless explicitly agreed in writing.

### 9. Modifications to Products and Services

Sirdata reserves the right to modify or discontinue any Service in response to legal, security, or operational requirements. Clients will be notified 30 days in advance of any substantial modifications.

Sirdata also reserves the right to unilaterally modify Service terms to comply with evolving legal, technological, or operational requirements, with prior notice provided whenever possible.

In the case of substantial modifications, the Client may propose alternative terms within the 30-day notice period, subject to Sirdata’s discretion.

### 10. Custom Development or Integration

Sirdata is under no obligation to provide custom development or integration Services unless expressly agreed upon in a separate written agreement. Such custom requests are at Sirdata’s sole discretion and may be subject to additional fees.

### 11. Liability and Indemnification

Sirdata's liability under this SLA is strictly limited to the provision of Service Credits. Sirdata shall not be liable for any indirect, Incidental, or consequential damages, including but not limited to loss of profits or business interruptions.

The Client agrees to indemnify and hold Sirdata harmless from any claims, damages, or liabilities arising from misuse or unauthorized configuration of Sirdata’s Services.

Sirdata’s total liability under this SLA is strictly limited to Service Credits, which are capped at 10% of the annual fees paid by the Client for the affected Services. No other form of compensation, indemnification, or liability shall apply.

Sirdata shall not be liable for damages caused by third-party actions, such as unauthorized access, network failures, or unapproved integrations.

The Client’s remedies under this SLA are exclusively limited to those explicitly provided herein.

In the event of Sirdata's failure to meet the SLA commitments, the Client may request the early termination of the contract only after having sent a formal notice to Sirdata and allowing it a minimum period of 60 days to remedy the identified breaches.

### 12. Security

Sirdata implements industry-standard security measures but does not guarantee protection against unauthorized access, data breaches, or data loss.

The Client is responsible for securing their own systems and ensuring the use of Sirdata’s Services or Products in compliance with Sirdata’s security recommendations.

Any suspected security breach or unauthorized access involving Sirdata’s Services must be reported by the Client immediately.

Sirdata solely works with suppliers who implement industry-standard security measures, such as ISO 27001 and SOC 2 certifications, to ensure the integrity, availability, and confidentiality of personal data in compliance with GDPR Articles 5(1)(f) and 32.

However, Sirdata does not guarantee protection against unauthorized access, data breaches, or data loss. For the purposes of this clause, ‘data loss’ refers to the irreversible loss of personal data integrity, availability, or confidentiality due to unforeseen events, such as system failures, cyberattacks, or hardware malfunctions, except where Sirdata has acted negligently in implementing or maintaining agreed-upon security measures.

### 12.1. Handling of Security Reports2

Sirdata is committed to maintaining the highest level of security for its systems and users. In the event of a vulnerability or security report:

| Severity Level                                         | Initial Acknowledgment | Target Resolution Time |
| ------------------------------------------------------ | ---------------------- | ---------------------- |
| **Critical** (e.g. remote code execution, data breach) | **≤ 24 hours**         | **≤ 3 business days**  |
| **High** (e.g. privilege escalation, auth bypass)      | ≤ 1 business day       | ≤ 7 business days      |
| **Medium** (e.g. CSRF, minor injection)                | ≤ 2 business days      | ≤ 15 business days     |
| **Low / Informational**                                | ≤ 5 business days      | Best effort            |

Reports should be submitted to <security@sirdata.com>. Sirdata ensures continuous communication during remediation of high and critical issues.

### 13. Governing Law and Jurisdiction

This SLA is governed by French law, and any disputes arising under or in connection with it shall be subject to the exclusive jurisdiction of the Paris Commercial Court.

The parties agree to engage in good faith negotiations for a period of 90 days before initiating any legal proceedings. In the event of any dispute regarding the interpretation of this SLA, the French version shall take precedence over any translation.


