Population Density Data

Gain actionable insights with predictive population density estimations tailored to your specific area and timeframe.

Network Insights
Network API
Camara
Playground

Introduction

The CAMARA Population Density Data provides population density estimations for a specific area at the current or a future period of time. The estimation considers historical anonymised information of the network connected devices in the requested area.

API Scope

  • The API covers complete France territory.
  • Both synchronous & asynchronous modes are available. In order to provide good performance, synchronous request is limited in area type.
  • This API provides 2 types of data:
    • For future: predictive data one month ahead (example if we are June 6th 2026, you can get predicitive data till July 7th, 2026)
    • For past: real network data for last 12 month in the past (example if we are June 6th 2026, you can network data from June 7th,2025 to June 5th2026).
      • Note: Our API database was initialised December 1st, 2025 - data before this date are not available (so full year in the past will be available starting Dec 2nd, 2026).

Subscribe to the API

You get the Authorization header credentials when you register your application on the Orange Developer Console.

API Authentication

HTTPS requests to the REST API are protected with 2-Legged OAuth. To learn more about how Orange Developer handles authentication, please refer to our documentation.

In short, you will use your Orange Developer Authorization header as authorization_header for the Basic authentication with Orange Developer.

curl -X POST \
-H "Authorization: {{ authorization_header }}" \
-d "grant_type=client_credentials" \
https://api.orange.com/oauth/v3/token

In response, you will get an access_token.

{
  "token_type": "Bearer",
  "access_token": "66AeYJF8eJQ...2SjkFg9LB1LePC",
  "expires_in": 3600
}

API Description

Summary of resources

This API has one resource retrieve. In the response, the Population Density Data are provided by period of time (split of 30 minutes) and by geohash.

A geohash is a system for encoding geographic coordinates (latitude and longitude) into a compact string of letters and digits. It divides the world into a grid and represents each cell in the grid with a unique alphanumeric code. The precision of a geohash increases with its length; longer geohashes correspond to smaller geographic areas. In this implementation we use precision of 7 meaning that the length of the geohash will be 7 characters.

Summary of methods and URL

Use case of operationURL method
I want to retrieve population density estimation for a given time zone and a given areaPOST "https://api.orange.com/camara/ofr/population-density-data/v0.3/retrieve"

Population Density Request Description

Summary of request body parameters

Attribute NameDescription & comment
areaSee below
startTimeStart date time. It must follow RFC 3339 and must have time zone. Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z)
endTimeEnd date time. It must follow RFC 3339 and must have time zone. Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z)
precisionPrecision required of response cells. Precision defines a geohash level and corresponds to the length of the geohash for each cell. Precision level 7 is used.
sinkThe url address where the population density data response shall be delivered, using the HTTP protocol.
sinkcredentialA sink credential provides authentication or authorization information necessary to enable delivery of events to a target.

Note: data type & cardinality are available in the API reference

For the area, we expect in the request a polygon. Following information must be provided:

  • areaType valued to POLYGON (mandatory)
  • a point list with a minimum of 3, maximum of 15, featuring a latitude and a longitude

Response size limitations & sink: We define a 'chunk' as a population density data estimation for a geohash 7 for 30 minutes.

  • For a synchronous response (no sink in the request) the response cannot exceed 1000 chunks. If the response exceed 1000 chunks the error POPULATION_DENSITY_DATA.UNSUPPORTED_SYNC_RESPONSE with message "Indicated combination of area, time interval and precision is too big for a sync response" is send back
  • For an asynchronous response ( a sink in the request) we limit at 5000 chunks. If the response exceed 5000 chunks the error POPULATION_DENSITY_DATA.UNSUPPORTED_REQUEST with message "Indicated combination of area, time interval and precision is too big" is send back

Hint

To test the API with only one geohash in order to test it, you can use following area (which is a part of Paris Trocadéro gardens):

{
  "boundary": [
    {
      "latitude": 48.8605943359375,
      "longitude": 2.28850283203125
    },
    {
      "latitude": 48.8605943359375,
      "longitude": 2.289276123046875
    },
    {
      "latitude": 48.860421044921875,
      "longitude": 2.289276123046875
    },
    {
      "latitude": 48.8604210449218756,
      "longitude": 2.28850283203125
    }
  ]
}

Example of body request

Without callback url

{
  "area": {
    "areaType": "POLYGON",
    "boundary": [
      {
        "latitude": 41.351099,
        "longitude": 2.129661
      },
      {
        "latitude": 41.353928,
        "longitude": 2.136373
      },
      {
        "latitude": 41.354663,
        "longitude": 2.135839
      },
      {
        "latitude": 41.351921,
        "longitude": 2.128704
      }
    ]
  },
  "startTime": "2025-11-04T11:00:00.000Z",
  "endTime": "2025-11-04T11:39:59.000Z",
  "precision": 7
}

With callback url

{
  "area": {
    "areaType": "POLYGON",
    "boundary": [
      {
        "latitude": 41.351099,
        "longitude": 2.129661
      },
      {
        "latitude": 41.353928,
        "longitude": 2.136373
      },
      {
        "latitude": 41.354663,
        "longitude": 2.135839
      },
      {
        "latitude": 41.351921,
        "longitude": 2.128704
      }
    ]
  },
  "startTime": "2025-11-04T11:00:00.000Z",
  "endTime": "2025-11-04T11:39:59.000Z",
  "precision": 7,
  "sink": "https://webhook-orange.com/8816...1664"
}

Population Density Response Description

The response from the Population Density Data API contains population density values represented in time intervals for different cells of the requested area. Each element in the timedPopulationDensityData array corresponds to a time interval, containing population density data for the grid cells.

Response Attributes

Attribute NameDescription
timedPopulationDensityDataAn array of time ranges along with the population density data for the cells within it. The request startDate or endDate must be fully covered by the intervals.
statusRepresents the state of the response for the input polygon defined in the request. Possible values include: SUPPORTED_AREA, PART_OF_AREA_NOT_SUPPORTED, AREA_NOT_SUPPORTED.
startTimeThe interval start time, following RFC 3339 and must have a time zone. Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ.
endTimeThe interval end time, also following RFC 3339 and must have a time zone. Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ.
cellPopulationDensityDataAn array containing population density data for the different cells in a specific time range.
geohashCoordinates of the cell represented as a string using the Geohash system. The value length, and thus, the cell granularity, is determined by the request body property precision (7 in our case)
populationDensityDataAn object that contains the estimated population density and an estimation range in a cell for a specific time interval.
dataTypeIndicates the type of data returned, which can be NO_DATA, LOW_DENSITY, or DENSITY_ESTIMATION.
maxPplDensityMaximum people/km² estimated for the defined area.
minPplDensityMinimum people/km² estimated for the defined area.
pplDensityThe estimated population density in people/km² for the defined area.

Notes

  • The response may include multiple intervals depending on the requested time range.
  • In order to ensure anonymized information, if the data relating to a grid cell in the required time interval is not sufficient to be exposed due to k-anonymity, no such data is returned by the API and the value of the dataType property is LOW_DENSITY. If the pplDensity is above the minimum, but the minPplDensity is below this minimum, the API response will answer 0 for the minPplDensity.

Examples

Response (extract) for a request requesting a synchronous response (without sink in the request) for an area managed.

{
  "timedPopulationDensityData": [
    {
      "startTime": "2025-05-07T14:00:00Z",
      "endTime": "2025-05-07T14:30:00Z",
      "cellPopulationDensityData": [
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tun9",
          "maxPplDensity": 120825,
          "minPplDensity": 56213,
          "pplDensity": 63647
        },
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tunc",
          "maxPplDensity": 134575,
          "minPplDensity": 70874,
          "pplDensity": 79007
        },
        {...}
      ]
    },
    {
      "startTime": "2025-05-07T14:30:00Z",
      "endTime": "2025-05-07T15:00:00Z",
      "cellPopulationDensityData": [
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tun9",
          "maxPplDensity": 115611,
          "minPplDensity": 50062,
          "pplDensity": 62496
        },
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tunc",
          "maxPplDensity": 129097,
          "minPplDensity": 56154,
          "pplDensity": 78297
        },
        {...}
      ]
    }
  ],
  "status": "SUPPORTED_AREA"
}

Response (extract) for a request requesting a synchronous response (without sink in the request) for an area partially managed.

{
  "timedPopulationDensityData": [
    {
      "startTime": "2025-05-07T14:00:00Z",
      "endTime": "2025-05-07T14:30:00Z",
      "cellPopulationDensityData": [
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tbup",
          "maxPplDensity": 7115,
          "minPplDensity": 3595,
          "pplDensity": 5044
        },
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tch0",
          "maxPplDensity": 6745,
          "minPplDensity": 3096,
          "pplDensity": 4211
        },
        {...},
        {
          "dataType": "NO_DATA",
          "geohash": "u09tbuh"
        },
        {
          "dataType": "NO_DATA",
          "geohash": "u09tbue"
        },
        {...}
      ]
    }
  ],
  "status": "PART_OF_AREA_NOT_SUPPORTED"
}

Response (extract) for a request requesting a synchronous response (without sink in the request) for an area not managed.

{
  "timedPopulationDensityData": [],
  "status": "AREA_NOT_SUPPORTED"
}

Response for a request requesting an asynchronous response (with sink in the request)

{
  "operationId": "d3627484-b677-47b1-8583-cc5e4d287c0d"
}

The Population density data information is send to the sink url. It is important to note in the event the presence of the operationId to correlate the API response - example of event received:

{
  "timedPopulationDensityData": [
    {
      "startTime": "2025-05-05T16:00:00Z",
      "endTime": "2025-05-05T16:30:00Z",
      "cellPopulationDensityData": [
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tun9",
          "maxPplDensity": 106306,
          "minPplDensity": 55776,
          "pplDensity": 74177
        },
        {
          "dataType": "DENSITY_ESTIMATION",
          "geohash": "u09tunc",
          "maxPplDensity": 116881,
          "minPplDensity": 70804,
          "pplDensity": 90135
        },
        {...}
      ]
    }
  ],
  "status": "SUPPORTED_AREA",
  "operationId": "d3627484-b677-47b1-8583-cc5e4d287c0d"
}

Most common errors

  • Maximum time period query-able is 7 days - if the requested period exceed an error 400 is send back with code POPULATION_DENSITY_DATA.MAX_TIME_PERIOD_EXCEEDED
  • Only precision 7 is managed - if another value is provided an error 422 is send back with code POPULATION_DENSITY_DATA.UNSUPPORTED_PRECISION
  • If the end date is earlier than the start date an error 400 is send back with code POPULATION_DENSITY_DATA.INVALID_END_DATE
  • If the end date or the start date is missing an error 400 is send back with code POPULATION_DENSITY_DATA.INVALID_ENDTIME or POPULATION_DENSITY_DATA.INVALID_STARTTIME

Looking for support ?

Facing technical issue when using this API ? please contact us