Data Subject Requests (GDPR)
Under the GDPR, a person can ask for a copy of their personal data. A person can also ask for the erasure of their personal data. This page tells you how GoWit handles these requests. It also tells you what you must do as a marketplace.
Roles
GoWit keeps personal data about two groups of people. The role of GoWit is different for each group.
| Group | Example data | Controller | Processor |
|---|---|---|---|
| Shoppers on your site or app | customer_id, session_id, ad impressions, clicks and sales | Your marketplace | GoWit |
| Dashboard users (your staff and your advertisers' staff) | Name, email, login data | GoWit | — |
- For shopper data, you are the controller. The shopper sends the request to you. You send it to GoWit through the API on this page.
- For dashboard users, GoWit is the controller. The user sends the request to GoWit from the dashboard.
- For an advertiser (seller) contact, the advertiser record comes from your feed. Use the feed to remove the contact. See Advertisers and sellers.
Shopper requests
Use these endpoints for shopper requests. They use the same API key as the Integration API. Send the key in the Authorization header.
| Request | Endpoint |
|---|---|
| Erase shopper data | POST /public/marketplaces/{marketplaceID}/dsar/customers/erase |
| Export shopper data | POST /public/marketplaces/{marketplaceID}/dsar/customers/export |
| Get the request status | GET /public/marketplaces/{marketplaceID}/dsar/requests/{requestID} |
For the full schemas, see the Data Subject Requests API reference.
Erase shopper data
- Collect all
customer_idandsession_idvalues that you sent to GoWit for the shopper. - Send them in one request. Send at least one ID in total. Send at most 1,000 IDs in each list.
- Keep the
request_idfrom the response.
curl --location '<YOUR_BASE_URL>/public/marketplaces/19/dsar/customers/erase' \
--header 'Authorization: YOUR_MARKETPLACE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"customer_ids": ["c-8f14e45fceea167a"],
"session_ids": ["0b6f6c3e-2f1d-4c55-9a0e-6d1d2b7e7a10"]
}'
The response has the status 202 Accepted:
{
"request_id": 4211,
"status": "REQUESTED"
}
Export shopper data
- Send the
customer_idof the shopper. - Save the response body as a file. The response is the export.
- Give the file to the shopper.
GoWit builds the export when you send the request. The response has the status 200 OK and the header Content-Disposition: attachment; filename="gowit-shopper-export-YYYY-MM-DD.json". The file contains at most 10,000 events. If the shopper has more, the field truncated is true and the file holds the oldest 10,000. Contact GoWit support for the rest.
GoWit does not store the export file. GoWit records only that the export occurred, with a hashed customer ID.
You can send at most 60 export requests per hour for each marketplace. Over this limit, the API returns 429 Too Many Requests with a Retry-After header. Wait for the Retry-After seconds, then try again.
curl --location '<YOUR_BASE_URL>/public/marketplaces/19/dsar/customers/export' \
--header 'Authorization: YOUR_MARKETPLACE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": "c-8f14e45fceea167a"
}' \
--output gowit-shopper-export.json
The file has this structure. The example is a captured response from a test marketplace; it shows one of the three events.
{
"request_id": 3,
"generated_at": "2026-10-08T10:51:43.823Z",
"marketplace_id": 1,
"customer_id": "dsar-after-002",
"event_count": 3,
"truncated": false,
"events": [
{
"ad_id": "",
"ad_placement_id": 1,
"ad_request": null,
"ad_response": null,
"advertiser_id": 0,
"age_range": "",
"agency_id": 0,
"arrival_date": "1970-01-01T00:00:00Z",
"attributed_time": "1970-01-01T00:00:00Z",
"auction_type": "",
"audience_ids": [],
"bid": null,
"campaign_id": 1,
"category_id": 0,
"category_text": "",
"channel": 0,
"city": "",
"click": null,
"creative_id": 0,
"currency": "",
"customer_age": 0,
"customer_city": "",
"customer_device_environment_type": "",
"customer_device_type": "",
"customer_gender": "",
"customer_id": "dsar-after-002",
"customer_targeting": "",
"customer_type": "",
"customer_user_agent": "",
"device_id": null,
"direct_sale": null,
"direct_sale_amount": null,
"event_id": "",
"event_type": "impression",
"gender": "",
"impression": null,
"indirect_sale": null,
"indirect_sale_amount": null,
"keyword": "",
"keyword_id": 0,
"language": "",
"location_id": 0,
"marketplace_conversion_range": 0,
"marketplace_id": 1,
"match_type": "",
"offsite_campaign_id": 0,
"offsite_click": null,
"offsite_creative_id": 0,
"offsite_direct_sale": null,
"offsite_direct_sale_amount": null,
"offsite_indirect_sale": null,
"offsite_indirect_sale_amount": null,
"order_id": "",
"organic_sale": null,
"organic_sale_amount": null,
"placement_id": 0,
"platform": "",
"post_attributed": 0,
"post_click_direct_sale": null,
"post_click_direct_sale_amount": null,
"post_click_indirect_sale": null,
"post_click_indirect_sale_amount": null,
"post_view_direct_sale": null,
"post_view_direct_sale_amount": null,
"post_view_indirect_sale": null,
"post_view_indirect_sale_amount": null,
"product_id": 1,
"product_impression": null,
"product_resource_id": "",
"region_id": 0,
"request_id": "",
"request_product_resource_id": [],
"sale": null,
"sale_amount": null,
"sale_request_product_resource_id": "",
"sale_request_product_taxonomy": "",
"search_text": "",
"segment_ids": [],
"session_id": "dsar-after-session-002",
"spend": null,
"time": "2026-10-08T10:38:44Z",
"video_complete": null,
"video_start": null,
"viewable_impression": null
}
]
}
events contains the ad event rows of the shopper: impressions, clicks and sales. event_count is the number of rows.
Get the request status
Use the status endpoint to monitor an erase request. An export request has the status DONE immediately.
curl --location '<YOUR_BASE_URL>/public/marketplaces/19/dsar/requests/4211' \
--header 'Authorization: YOUR_MARKETPLACE_API_KEY'
{
"request_id": 4211,
"request_type": "ERASE",
"status": "DONE",
"created_at": "2026-10-07T09:15:00Z",
"completed_at": "2026-10-08T03:04:12Z"
}
The status is one of REQUESTED, APPROVED, RUNNING, DONE, FAILED or REJECTED. All times are RFC 3339 in UTC.
Shopper identifiers must be pseudonymous
- Do not put an email address, a phone number or a name in
customer_id. - Use your internal user ID, or a hash of it.
- Use a random value for
session_id, for example a UUID.
GoWit does not need to know who the shopper is. With pseudonymous IDs, the ad data does not identify a person directly.
Dashboard user requests
A dashboard user manages their own requests from the My account page in the GoWit dashboard.
- Download my data: the user downloads a JSON file with their personal data immediately.
- Request deletion: the user sends an erasure request. A GoWit administrator checks the request and does the erasure.
GoWit does not accept erasure requests by email. GoWit cannot confirm the identity of the sender of an email. Tell your users to log in and use the My account page.
To correct a name or an email address, the user contacts GoWit support.
Advertisers and sellers
When your feed sends an advertiser with the status DELETED:
- GoWit removes the contact email of the advertiser.
- The advertiser stays
PAUSED. Its campaigns do not run. - GoWit keeps the advertiser record and its reports. The reports stay correct for you and your other advertisers.
If a seller asks for full erasure of their contact data, contact GoWit support. After GoWit erases a seller contact, later feed updates do not write the email or the name back.
Time limits
| Request | Time limit |
|---|---|
| Shopper erasure | Within 24 hours. A daily purge at 02:00 UTC erases all open shopper requests. |
| Shopper export | Immediately, in the response. |
| Dashboard user erasure | Within 30 days after the user sends the request from the My account page. |
| Dashboard user export | Immediately, from the My account page. |
Backups and logs
GoWit does not change backups and logs after an erasure. Backups and logs expire within the retention period stated in our DPA.
GoWit records each erasure. If GoWit restores a database from a backup, GoWit applies the recorded erasures again before the data is used. A restore can also remove the records of erase requests that you sent after the backup time, open or completed. GoWit then copies these records back from the database as it was before the restore. If GoWit cannot do that, GoWit tells you the affected period and asks you to send the erase requests of that period again. To send a completed request again is safe: the data stays erased, and GoWit records the erasure again.
Keep the request_id and the send time of each request. A 404 from the status endpoint for a known request_id means that a restore removed the request record. A copied record gets a new request_id. Contact GoWit support: GoWit tells you if the erasure is done or if you must send the request again.