Bulk Download API
Asynchronous bulk access to large data slices, starting with fixed infrastructure detections from Sentinel-1 and Sentinel-2 imagery.
Bulk Download API Introduction
The Bulk Download API is designed to support workflows that require bulk access to data, including integration with platforms and tools used by data engineers and researchers. At the moment we are releasing with the API dataset of Fixed infrastructure detections derived from Sentinel-1 and Sentinel-2 satellite imagery.
Listing endpoints in this API are paginated. See Pagination for how limit, offset, and nextOffset work.
This API allows you to:
- Create bulk reports based on specific filters and spatial parameters
- Monitor report generation status
- Download datasets in CSV or JSON format
- Retrieve region geometry and metadata
Supported Bulk-download API Datasets
Fixed infrastructure detections from Sentinel-1 and Sentinel-2
The API dataset used in this API is:
public-fixed-infrastructure-data:latest
Offshore fixed infrastructure is a global dataset detected and classified using Synthetic Aperture Radar (SAR) and Optical imagery from the Sentinel-1 and Sentinel-2 satellite constellations. The dataset is updated daily and includes detections from 2017 to approximately three months before the current date. This dataset supports use cases in maritime domain awareness, vessel monitoring, marine spatial planning, and environmental analysis. Refer to Paolo et al. 2024, Nature: View the paper. This API dataset returns the same data published in our Data Download Portal here.
Detection is performed using a Constant False Alarm Rate (CFAR) algorithm, modified to exclude non-stationary objects. Deep learning (based on the ConvNeXt architecture) is applied to classify detections into the categories: oil, wind, unknown, lake maracaibo, and noise. Post-processing includes clustering, temporal smoothing, and manual expert review. Each detection is assigned a confidence level (high, medium, or low) to support interpretation. For more details on Data Caveats, please visit, Fixed Infrastructure Data Caveats
Difference between this Bulk Download API and the Datasets API regarding fixed infrastructure
This Bulk Download API returns all fixed infrastructure data, including regions like Chile, Canada, and Norway, as well as some noisy data, while the Datasets API and our Map filter out noisy data.
Available Bulk Download API endpoints
- Create a new Bulk Report – Generate fixed infrastructure reports by specifying spatial filters, dataset, and date range. Supports CSV or JSON formats.
- Get Bulk Report status by ID – Check the current status of a report (e.g.
pending,done,failed) and metadata including creation timestamp. - Download report files – Retrieve signed URLs for downloading the data file (
DATA), metadata (README), or region geometry (GEOM) used in the report. - Query report results in JSON – Access the structured contents of the generated report with pagination and sorting capabilities. Ideal for filtered previews or integration with scripts.
Create a Bulk Report
Bulk Report - HTTP Request
POST https://gateway.api.globalfishingwatch.org/v3/bulk-reports
Bulk Report - Body only for POST request
| Parameter | Description | Required | Format | Param Type |
|---|---|---|---|---|
name | Name of your report | true | string | body |
dataset | Specify the dataset used to generate the report (e.g., public-fixed-infrastructure-data:latest) | true | string | body |
geojson | GeoJSON object defining a custom region to filter | true | string (GeoJSON) | body |
format | Output format of the report. Available options: CSV or JSON | true | Enum: [CSV, JSON] | body |
region | Predefined region object including dataset and id (e.g., EEZ, MPA, RFMO). See region dataset | false | object | body |
filters | Array of filters to apply. For public-fixed-infrastructure-data:latest, available filters include:• label (oil, wind, unknown)• structure_start_date (date format YYYY-MM-DD)• structure_end_date (date format YYYY-MM-DD)• label_confidence (low, medium, high)• structure_id (integer or string)Example: ["label = 'oil'", "structure_start_date between '2020-01-01' and '2025-01-01'"] | true | array of strings | body |
Bulk Report - Create a Bulk Report examples
These examples are available:
- Example 1 (POST) - Generate SAR fixed infrastructure report for Argentina EEZ with filter by
label = 'oil'andstructure_start_date - Example 2 (POST) - Generate report for Argentina EEZ with filter by
label_confidence = 'high' - Example 3 (POST) - Generate report for Argentina EEZ with filter by
label_confidence = 'medium' - Example 4 (POST) - Generate report for Argentina EEZ with filter by
label_confidence = 'low' - Example 5 (POST) - Generate report for Argentina EEZ with filter by
structure_id = 313068 - Example 6 (POST) - Generate report for Argentina EEZ with filters by
structure_start_dateandstructure_end_date - Example 7 (POST) - Generate report using custom GeoJSON region with filters by
labeland date range
Bulk Report - Response
Since this is the same dataset Fixed infrastructure detections from Sentinel-1 and Sentinel-2 from our Data Download Portal, you can find the definitions of each field there.
Bulk Report Object Schema
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
id | string | true | UUID format | Unique identifier of the report |
dataset | string | true | e.g. public-fixed-infrastructure-data:v1.1 | API dataset used to generate the report. The response may contain the resolved version of an alias such as latest. |
name | string | true | Name assigned to the report | |
filepath | string | true | e.g. fixed_infrastructure_202407.csv | File name inside of the dataset |
format | string | true | Enum: CSV, JSON | Format of the report output |
filters | array | true | Array of strings | List of applied filters (e.g. date range, label, confidence) |
geom | object | true | Geography used for the report (region ID or custom GeoJSON) | |
status | string | true | Enum: pending, processing, done, failed | Current status of the report |
ownerId | number | true | ID of the user or application that generated the report | |
ownerType | string | true | Type of owner (e.g. user-application) | |
createdAt | datetime | true | ISO 8601 format | Timestamp when the report was created |
updatedAt | datetime | true | ISO 8601 format | Timestamp when the report was last updated |
fileSize | number | false | Size of the final report file (if available) |
Get Bulk Report by ID
This endpoint allows you to retrieve metadata and status of a previously created report using its unique report ID. Use this endpoint to check the current status of a bulk report. Depending on the complexity and size of your request (e.g. large region, long time range), generating the report can take several minutes to several hours. We recommend polling this endpoint periodically to monitor the report’s progress.
Get Bulk Report by ID - HTTP Request
GET https://gateway.api.globalfishingwatch.org/v3/bulk-reports/{id}
Get Bulk Report by ID - URL Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
id | Yes | string | id of the report |
Get Bulk Report by ID - HTTP Response
Returns the same structure as the response from Create Bulk Report, including fields such as status, name, createdAt, filters, and more. See the Bulk Report - Response Schema for the complete structure.
EXAMPLE: Get bulk report by id
curl --location 'https://gateway.api.globalfishingwatch.org/v3/bulk-reports/adbb9b62-5c08-4142-82e0-b2b575f3e058' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer TOKEN'// Make sure to replace [TOKEN] with your API Access Token.
const res = await fetch(
'https://gateway.api.globalfishingwatch.org/v3/bulk-reports/adbb9b62-5c08-4142-82e0-b2b575f3e058',
{ headers: { Authorization: 'Bearer [TOKEN]' } }
)
const data = await res.json()EXAMPLE: RESPONSE - Get bulk report by id
{
"id": "adbb9b62-5c08-4142-82e0-b2b575f3e058",
"dataset": "public-fixed-infrastructure-data:v1.1",
"name": "sar-vessel-detection-example-1",
"filepath": "sar_fixed_infrastructure_202409.csv",
"filters": [
"label = 'oil'",
"structure_start_date between '2020-01-01' and '2025-01-01' "
],
"status": "done",
"geom": {
"id": 8466,
"type": "dataset",
"dataset": "public-eez-areas"
},
"createdAt": "2025-06-27T06:43:35.571Z",
"updatedAt": "2025-06-27T06:43:35.571Z",
"ownerId": 509,
"ownerType": "user-application",
"format": "CSV",
"fileSize": 1207
}Download bulk Report (URL File)
This endpoint allows to download the data once the report is “done”.
Download Bulk Report - HTTP Request
GET https://gateway.api.globalfishingwatch.org/v3/bulk-reports/{id}/download-file-url
The response will return a link to our Google Cloud Platform infrastructure where the data can be downloaded.
Download Bulk Report - URL Parameters for GET Requests
| Parameter | Description | Required | Format | Param Type |
|---|---|---|---|---|
id | ID of the bulk report, returned in the response when creating the report. | true | string | path |
file | Type of file to download. Options include: • DATA – the dataset file (CSV or JSON) • README – metadata documentation file • GEOM – the region geometry in GeoJSON format | true | string | query |
Download Bulk Report – HTTP Response
Once the report is ready (status: done), this endpoint returns a signed URL to download the requested file (DATA, README, or GEOM). The response is a JSON object containing a single url field that points to a downloadable file hosted on Global Fishing Watch's cloud infrastructure.
Download Bulk Report - Examples
These examples are available:
In these examples, we use the report generated in the endpoint from the Create bulk endpoint which has as report id: adbb9b62-5c08-4142-82e0-b2b575f3e058.
- Example 1 (GET) - Get url of the data file to download it - README
- Example 2 (GET) - Get url of the data file to download it - DATA
- Example 3 (GET) - Get url of the data file to download it - GEOM
Get Data in JSON Format
The query endpoint allows us to get the data in JSON format
Get Data in JSON Format - HTTP Request
GET https://gateway.api.globalfishingwatch.org/v3/bulk-reports/:id/query
Get Data in JSON Format - URL Parameters
| Parameter | Description | Required | Format | Param Type |
|---|---|---|---|---|
id | ID of the bulk report | true | string | path |
limit | Maximum number of records to return | false | integer | query |
offset | Number of records to skip before starting to return results | false | integer | query |
sort | Field(s) to sort the results by. Use - prefix for descending order. Supported fields include: • structure_start_date – date of first detection of the structure • structure_end_date – date of last detection • detection_date – date of specific satellite detection • label – predicted structure type (oil, wind, unknown) • label_confidence – label quality (low, medium, high) | false | string | query |
fields | Comma-separated list of fields to include in the response | false | string array | query |
This is a GET request and does not require a body.
Get Data in JSON Format - HTTP Response
Since this is the same dataset Fixed infrastructure detections from Sentinel-1 and Sentinel-2 from our Data Download Portal, you can find the definitions of each field there
Returns a paginated list of detections from the Fixed Infrastructure dataset.
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
detection_id | string | false | - | Unique ID of the satellite detection |
detection_date | string | false | date (YYYY-MM-DD) | Date of the detection |
structure_id | string | true | - | Unique ID that groups all detections of the same structure |
lon | number | true | float | Longitude of the detection |
lat | number | true | float | Latitude of the detection |
structure_start_date | string | false | date (YYYY-MM-DD) | First detection date of the structure |
structure_end_date | string | false | date (YYYY-MM-DD) or null | Last detection date of the structure |
label | string | false | oil, wind, unknown | Predicted type of offshore structure |
label_confidence | string | false | low, medium, high | Classification confidence of the label |
Get Data in JSON Format Examples
These examples are available:
- Example 1 (GET) - Get data as json sort by structure start date DESC
- Example 2 (GET) - Get data as json sort by detection date ASC
- Example 3 (GET) - Get data as json sort by label
- Example 4 (GET) - Get data as json sort by label confidence
- Example 5 (GET) - Get data as json sort by structure start date DESC and only structure id field
- Example 6 (GET) - Get data as json sort by structure end date ASC and only 3 fields
Get All Bulk Reports by User
Use this endpoint to retrieve all bulk reports created by your user or application. It supports pagination, sorting, and optional filtering by status or API dataset (see list of datasets available here). You can filter by the API dataset alias, such as public-fixed-infrastructure-data:latest, or by the resolved versioned value returned in the report response, such as public-fixed-infrastructure-data:v1.1.
Bulk Reports GET - HTTP Request
GET https://gateway.api.globalfishingwatch.org/v3/bulk-reports
Bulk Reports GET - URL Parameters
| Parameter | Description | Required | Format | Param Type |
|---|---|---|---|---|
limit | Number of results to return. Example: 10 | true | number | query |
offset | Offset into the results, used for pagination. Starts at 0. Example: 5 | true | number | query |
sort | Sort by column. Prefix with + (ASC) or - (DESC). Example: -createdAt | false | string | query |
status | Filter by report status: pending, processing, done, failed | false | string | query |
dataset | Filter reports by API dataset alias or resolved version. Examples: public-fixed-infrastructure-data:latest, public-fixed-infrastructure-data:v1.1 | false | string | query |
EXAMPLE (GET) – Retrieve list of bulk reports sorted by creation date
# Make sure to replace [TOKEN] with your API Access Token.
curl --location 'https://gateway.api.globalfishingwatch.org/v3/bulk-reports?limit=10&offset=5&sort=-createdAt&dataset=public-fixed-infrastructure-data:latest' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer [TOKEN]'// Make sure to replace [TOKEN] with your API Access Token.
const res = await fetch(
'https://gateway.api.globalfishingwatch.org/v3/bulk-reports?limit=10&offset=5&sort=-createdAt&dataset=public-fixed-infrastructure-data:latest',
{ headers: { Authorization: 'Bearer [TOKEN]' } }
)
const data = await res.json()EXAMPLE: RESPONSE (GET) – Retrieve list of bulk reports sorted by creation date
{
"metadata": {},
"limit": 10,
"offset": 5,
"nextOffset": null,
"total": 10,
"entries": [
{
"id": "d16d2d2a-b415-4f47-a525-54d60c0db2cd",
"dataset": "public-fixed-infrastructure-data:v1.1",
"name": "sar-vessel-detection-example-1",
"filepath": "sar_fixed_infrastructure_202409.csv",
"filters": [
"label = 'oil'",
"structure_start_date between '2020-01-01' and '2025-01-01'"
],
"status": "done",
"geom": {
"id": 8466,
"type": "dataset",
"dataset": "public-eez-areas"
},
"createdAt": "2025-06-24T14:21:27.517Z",
"updatedAt": "2025-06-24T14:21:27.517Z",
"ownerId": 385,
"ownerType": "user-application",
"format": "CSV",
"fileSize": 1207
}
]
}Bulk Reports GET - HTTP Response
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
metadata | object | false | — | Contains metadata related to the query, such as dataset or filters used. |
limit | number | true | ≥ 1 | Number of items returned in this response. |
offset | number | true | ≥ 0 | Offset position of the first item in the response. |
nextOffset | number | false | ≥ 0 | Offset for the next page of results, if available. |
total | number | true | ≥ 0 | Total number of matching reports available for the user. |
entries | array | true | — | List of bulk reports matching the request. Each entry contains the fields below. |
id | string | true | UUID | Unique identifier of the bulk report. |
dataset | string | true | e.g. public-fixed-infrastructure-data:v1.1 | API dataset used to generate the bulk report. The response may contain the resolved version of an alias such as latest. |
name | string | true | — | Human-readable name of the bulk report. |
filepath | string | true | filename | Name of the output file generated by the report. |
filters | array | false | — | Array of string filters used when generating the report. |
status | string | true | Enum: pending, processing, done, failed | Current status of the report generation process. |
geom.id | number | true | — | ID of the geometry used to define the report region. |
geom.type | string | true | Enum: dataset, geojson | Type of geometry input. |
geom.dataset | string | true | e.g., public-eez-areas | Dataset associated with the region if using reference geometry. |
createdAt | string | true | ISO 8601 | Timestamp when the report was created. |
updatedAt | string | true | ISO 8601 | Timestamp when the report was last updated. |
ownerId | number | true | — | ID of the user or application that created the report. |
ownerType | string | true | Enum: user-application | Type of entity that created the report. |
format | string | true | Enum: CSV, JSON | Format of the generated report file. |
fileSize | number | false | ≥ 0 (in bytes) | Size of the output file in bytes. |
Bulk Reports GET - Status Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successfully retrieved the list of bulk reports. | Bulk Report Response properties |
| 401 | Unauthorized | Your request did not include a valid API token. | Error Codes |
| 403 | Forbidden | You do not have permission to access these reports. | Error Codes |
| 422 | Unprocessable Entity | Your query parameters are invalid or malformed. | Error Codes |
| 500 | Internal Server Error | A server-side issue occurred. Please contact us at apis@globalfishingwatch.org | Error Codes |