Endpoints
Below we describe the currently published API endpoints per resource.
Requirements
An existing project in Agouti.
An API-KEY or JWT Bearer token for authentication (request an API-KEY by contacting Agouti support).
Add auth to the requests like
-H 'X-API-KEY: your_api_key_here'or-H 'Authorization: Bearer your_jwt_token_here'.
Projects
Most things in Agouti are organized around projects. Each project has its own set of cameras, locations, deployments, sequences and annotations. If you set an AI model in the ‘Automatic annotation’ property of the project, new deployments can be automatically annotated using that model.
List projects you are involved with
curl https://api.agouti.eu/v1/me/projects
[
{
"id": "3c61e604-5e6d-456f-91ea-f54081904f9c",
"name": "Example project",
"createdAt": "2025-10-317T10:10:14.572Z"
}
]
See more details of the project
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c
{
"id": "3c61e604-5e6d-456f-91ea-f54081904f9c",
"name": "Example project",
"createdAt": "2025-10-317T10:10:14.572Z"
"description": null,
"utcOffsetDefault": "+00:00"
}
Cameras
List cameras in a project
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/cameras
[
{
"id": "8d3ff2ab-d6e4-4064-b852-89ae8701ee55",
"label": "CT08",
"make": "Browning",
"model": "BTC-5PX-1080",
"serialNumber": "NG_CT08",
"yearOfPurchase": 2024
}
]
Add a camera to a project
curl -XPOST https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/cameras \
-H 'Content-Type: application/json' \
-d '{
"label": "CT08 v2",
"make": "Browning v2",
"model": "BTC-5PX-1080 v2",
"serialNumber": "NG_CT08 v2",
"yearOfPurchase": 2025
}'
{
"id": "eac30e00-4266-4ff0-9990-211c0afb0357",
"label": "CT08 v2",
"make": "Browning v2",
"model": "BTC-5PX-1080 v2",
"serialNumber": "NG_CT08 v2",
"yearOfPurchase": 2025
}
Update fields of a camera
curl -XPATCH https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/cameras/eac30e00-4266-4ff0-9990-211c0afb0357 \
-H 'Content-Type: application/json' \
-d '{
"label": "Actually CT08 v3",
"yearOfPurchase": 2099
}'
// 204 No Content
Delete a camera
curl -XDELETE https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/cameras/cb697f45-98fa-40e5-8857-74f929f5d47d
// 204 No Content
Locations
Projects have a list of locations defined, these are also called sampling points.
List locations in a project
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/locations
[
{
"id": "a4efb8f4-1c46-4e6c-8149-aa334fa0ceeb",
"name": "Forest edge near small tree",
"lat": 41.41,
"lng": -7.89
}
]
Add a location to a project
curl -XPOST https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/locations \
-H 'Content-Type: application/json' \
-d '{
"name": "Forest edge near big rock",
"lat": 41.41,
"lng": -7.99
}'
{
"id": "aca1d95d-f048-49b6-be3b-7ed02ac64bf8",
"name": "Forest edge near big rock",
"lat": 41.41,
"lng": -7.99
}
Update fields of a location
curl -XPATCH https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/locations/aca1d95d-f048-49b6-be3b-7ed02ac64bf8 \
-H 'Content-Type: application/json' \
-d '{
"lat": 10.01,
"lng": 20.02
}'
// 204 No Content
Delete a location
curl -XDELETE https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/locations/aca1d95d-f048-49b6-be3b-7ed02ac64bf8
// 204 No Content
Deployments
List deployments in a project
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments
Create a new deployment in a project, using the location and camera from before.
Set automaticAi = true if you want Agouti to automatically annotate the deployment after the sequences have been created.
This will only work if the project has a model selected for ‘Automatic annotation’. This has to be set on agouti.eu.
curl -XPOST https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments \
-H 'Content-Type: application/json' \
-d '{
"startDate": "2026-01-01T21:00:00.000Z",
"endDate": "2026-01-07T20:59:59.000Z",
"utcOffset": "+01:00",
"camera": "8d3ff2ab-d6e4-4064-b852-89ae8701ee55",
"location": "a4efb8f4-1c46-4e6c-8149-aa334fa0ceeb",
"notes": "Deployment near the waterhole v1 API",
"automaticAi": true
}'
{
"id": "cd7cf64c-1e0e-4bc1-892a-28af1157abf1",
"createdAt": "2025-10-31T10:47:36.603Z",
"createdBy": "ef6c4345-9e04-4d36-bb07-90bf74d27f80",
"startDate": "2026-01-01T21:00:00.000Z",
"endDate": "2026-01-07T20:59:59.000Z",
"utcOffset": "+01:00",
"camera": "8d3ff2ab-d6e4-4064-b852-89ae8701ee55",
"location": "a4efb8f4-1c46-4e6c-8149-aa334fa0ceeb",
"project": "3c61e604-5e6d-456f-91ea-f54081904f9c",
"notes": "Deployment near the waterhole v1 API"
}
Get details of a deployment
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments/cd7cf64c-1e0e-4bc1-892a-28af1157abf1
{
"id": "cd7cf64c-1e0e-4bc1-892a-28af1157abf1",
"createdAt": "2025-10-31T10:47:36.603Z",
"createdBy": "ef6c4345-9e04-4d36-bb07-90bf74d27f81",
"startDate": "2026-01-01T21:00:00.000Z",
"endDate": "2026-01-07T20:59:59.000Z",
"utcOffset": "+01:00",
"camera": "8d3ff2ab-d6e4-4064-b852-89ae8701ee55",
"location": "a4efb8f4-1c46-4e6c-8149-aa334fa0ceeb",
"project": "3c61e604-5e6d-456f-91ea-f54081904f9c",
"notes": "Deployment near the waterhole v1 API"
}
Get status of a deployment.
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments/cd7cf64c-1e0e-4bc1-892a-28af1157abf1/status
{
"status": "WaitingForFiles",
"description": "Deployment is awaiting uploads. Finalize the deployment once all files have been uploaded to start sequence creation.",
"nrAssets": 0,
"nrSequences": 0,
"aiModelState": null,
"percentInspected": 0,
"percentInspectedWithAi": 0
}
Upload files to a deployment. For below example make sure to have IMG_000{1,2,3}.JPG in your working dir.
Use this if you want to uploads all .JPG files at once: $(for f in ./*JPG; do echo -F "file=@$f"; done).
curl -XPOST https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments/cd7cf64c-1e0e-4bc1-892a-28af1157abf1/upload \
-H 'Content-Type: multipart/form-data' \
-F 'file=@IMG_0001.JPG' \
-F 'file=@IMG_0002.JPG' \
-F 'file=@IMG_0003.JPG'
{
"duplicates": 0,
"failed": 0,
"processed": 3,
"success": true
}
Finalize a deployment. This will start sequence creation and optional AI-annotation.
curl -XPOST https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments/cd7cf64c-1e0e-4bc1-892a-28af1157abf1/finalizeUpload
{
"message": "Deployment finalized and queued for sequence creation. Deployment will also be queued for automatic AI annotation."
}
Use the above /status endpoint to see how far along the processing is. These are some example responses:
{ "status": "WaitingForFiles" }
{ "status": "SequenceCreationQueued" }
{ "status": "SequenceCreationInProgress" }
{ "status": "SequenceCreationFailed" }
{ "status": "SequenceCreationCompleted" }
{ "status": "AIAnnotationQueued" }
{ "status": "AIAnnotationInProgress" }
{ "status": "AIAnnotationFailed" }
{ "status": "AIAnnotationCompleted" }
{ "status": "Invalid" }
{ "status": "Unknown" }
Exports
There are several endpoints to retrieve data from your project in Camtrap DP format.
deployments.csv
Supports filtering on
deploymentID(array)locationName(array)deploymentStart(string)
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/deployments.csv
media.csv
Supports filtering on
deploymentID(array)
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/media.csv
observations.csv
Supports filtering on
deploymentID(array)eventStart(string)
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/observations.csv
datapackage.json
curl https://api.agouti.eu/v1/projects/3c61e604-5e6d-456f-91ea-f54081904f9c/datapackage.json