🛡️ Anonymized Profile Data
Format and structure of anonymized user profile data
To protect user privacy, all profile data returned from our platform is anonymized and abstracted. This data can be used safely for content personalization and ad placement without risking individual identification.
Available Fields in the Profile Response
type Gender = 'male' | 'female' | 'other';
type Residence = string;
// Example: "Utrecht"
// Residence values are normalized Dutch municipality names based on opendata.cbs.nl.
// To preserve anonymity, small or sparsely populated areas are abstracted to broader regions.
// E.g. 'Oudeschild' becomes 'Wadden Islands'.
type AgeRange = [number, number | null];
// Represented as an inclusive lower and upper bound.
// If the upper bound is `null`, it represents an open-ended range.
// See **Standard Age Ranges** for the ranges in use
type ProfileResponse = {
gender: Gender;
residence: Residence;
ageRange: AgeRange;
};Example API Response (JSON)
{
"gender": "male",
"residence": "Aadorp",
"ageRange": [25, 35]
}Standard Age Ranges
These ranges are used to segment audiences. The exact implementation uses numeric bounds for flexibility, but most mappings align with:
| Definition | ageRange |
|---|---|
| Under 18 | [0, 17] |
| 18–24 | [18, 24] |
| 25–34 | [25, 34] |
| 35–44 | [35, 44] |
| 45–54 | [45, 54] |
| 55–64 | [55, 64] |
| 65+ | [65, null] |
Residence Data
Residence values are normalized Dutch municipality names based on opendata.cbs.nl. To preserve anonymity:
- Small or sparsely populated areas are abstracted to broader regions
- Example:
'Oudeschild'becomes'Wadden Islands' - Values are always at the municipality level or higher
Privacy Considerations
- No persistent identifiers are included—this data is transient and context-limited
- Anonymized at source: Data is abstracted to prevent individual identification
- Purpose-limited: Designed for privacy-safe audience targeting only
- No personal information: No names, emails, or other identifying data
Usage Examples
Checking Gender
if (profile.gender === 'male') {
// Show male-targeted content
} else if (profile.gender === 'female') {
// Show female-targeted content
} else {
// Show gender-neutral content
}Checking Age Range
const [minAge, maxAge] = profile.ageRange;
if (maxAge === null) {
console.log(`User is ${minAge} or older`);
} else {
console.log(`User is between ${minAge} and ${maxAge} years old`);
}Checking Residence
if (profile.residence.includes('Amsterdam')) {
// Show Amsterdam-specific content
} else if (profile.residence.includes('Rotterdam')) {
// Show Rotterdam-specific content
}Notes for Integration
- Purpose: The response is designed to support privacy-safe audience targeting
- Custom mapping: You're free to map the
[number, number | null]ranges into your own segment labels if needed - Graceful degradation: Always handle cases where profile data might be unavailable
- Cache considerations: Profile data can be cached, but respect the
cache_ttlsetting
Related Documentation
- API Reference - Complete client library API documentation
- Getting Started - How to fetch and use profile data in your integration