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