tridaPlatform developers

API reference

Shared capabilities for Trida products: Core (projects, keys, webhooks), Notify, Pay, Billing, AI. One API key per project; every key is scoped. Version 0.1.0. Generated from the OpenAPI contract: it cannot drift from the API.

Base URLs: https://api.trida.lu (Production), https://api-dev.trida.lu (Development). Authenticate with x-api-key.

platform

GET /api/health

Liveness and readiness of this process

No scope required beyond a valid key.

Responses

StatusMeaningBody
200HealthyHealth
503Database unreachableHealth

Example

curl -X GET "https://api.trida.lu/api/health" \
  -H "x-api-key: $TRIDA_API_KEY"

core

GET /core/v1/projects/me

The project the API key belongs to, with its theme and languages

Required scope: projects:read

Responses

StatusMeaningBody
200The projectProjectMe
401API key missing, invalid or revokedPlatformError
403The key lacks the projects:read scopePlatformError
404The project no longer existsPlatformError

Example

curl -X GET "https://api.trida.lu/core/v1/projects/me" \
  -H "x-api-key: $TRIDA_API_KEY"

POST /core/v1/subjects/erase

Erase or anonymize a person in every capability of the project, keeping what the law requires to keep

Required scope: subjects:erase

Parameters

NameInTypeRequiredNotes
idempotency-keyheaderstringyes

Request body

object

FieldTypeRequiredNotes
subjectobjectyes

Responses

StatusMeaningBody
200What each capability erased; the list is empty while no capability holds data about peopleSubjectErased
400The body or the Idempotency-Key is not validPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the subjects:erase scopePlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/subjects/erase" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "content-type: application/json" \
  -d '{"subject":{"type":"phone","value":"string"}}'

GET /core/v1/usage

Usage of the project by day, capability and metric, and its daily limits (UTC days, at most 92)

Required scope: usage:read

Parameters

NameInTypeRequiredNotes
fromquerystringno
toquerystringno

Responses

StatusMeaningBody
200The usageUsage
400A date is not YYYY-MM-DD, from is after to, or the range exceeds 92 daysPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the usage:read scopePlatformError

Example

curl -X GET "https://api.trida.lu/core/v1/usage" \
  -H "x-api-key: $TRIDA_API_KEY"

GET /core/v1/webhook-endpoints

List the endpoints of the project, never a secret

Required scope: webhooks:read

Responses

StatusMeaningBody
200The endpointsWebhookEndpointList
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError

Example

curl -X GET "https://api.trida.lu/core/v1/webhook-endpoints" \
  -H "x-api-key: $TRIDA_API_KEY"

POST /core/v1/webhook-endpoints

Declare an endpoint that receives the events of the project; the secret is returned once

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idempotency-keyheaderstringyes

Request body

object

FieldTypeRequiredNotes
urlstring (uri)yesmax length 2048
eventTypesarray of stringyes

Responses

StatusMeaningBody
201The endpoint and its HMAC secret, in clear this one timeWebhookEndpointCreated
400The body or the Idempotency-Key is not valid, the address is not a public HTTPS address, or the project already has 20 endpointsPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/webhook-endpoints" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "content-type: application/json" \
  -d '{"url":"https://example.com/webhooks/trida","eventTypes":["string"]}'

DELETE /core/v1/webhook-endpoints/{id}

Delete an endpoint and its secrets

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idpathstring (uuid)yes
idempotency-keyheaderstringyes

Responses

StatusMeaningBody
204Deleted
400The Idempotency-Key is missing or not validPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
404No such endpoint in this projectPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X DELETE "https://api.trida.lu/core/v1/webhook-endpoints/$ID" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

POST /core/v1/webhook-endpoints/{id}/rotate-secret

Make a new secret the active one; the previous one keeps signing until it is retired, so nothing is interrupted

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idpathstring (uuid)yes
idempotency-keyheaderstringyes

Responses

StatusMeaningBody
200The new secret, in clear this one timeWebhookSecretRotated
400The Idempotency-Key is missing or not validPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
404No such endpoint in this projectPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/webhook-endpoints/$ID/rotate-secret" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

POST /core/v1/webhook-endpoints/{id}/retire-previous-secret

End a rotation: the previous secret stops signing, only the active one remains

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idpathstring (uuid)yes
idempotency-keyheaderstringyes

Responses

StatusMeaningBody
200The endpointWebhookEndpoint
400The Idempotency-Key is missing or not valid, or there is no previous secretPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
404No such endpoint in this projectPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/webhook-endpoints/$ID/retire-previous-secret" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

POST /core/v1/events/{id}/replay

Replay an event to the active endpoints subscribed to its type: same eventId, new deliveries, fresh signature

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idpathstring (uuid)yes
idempotency-keyheaderstringyes

Responses

StatusMeaningBody
200How many deliveries were created, one per active subscribed endpoint (0 if none)WebhookReplayResult
400The Idempotency-Key is missing or not valid, or the event is still being dispatched for the first timePlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
404No such event in this projectPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/events/$ID/replay" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

POST /core/v1/webhook-endpoints/{id}/test

Send a signed test event (core.webhook.test) to this endpoint only, to try reception and signature verification

Required scope: webhooks:write

Parameters

NameInTypeRequiredNotes
idpathstring (uuid)yes
idempotency-keyheaderstringyes

Responses

StatusMeaningBody
200The test event was queued; it is delivered like any other event, signed with the active secretsWebhookTestSent
400The Idempotency-Key is missing or not validPlatformError
401API key missing, invalid or revokedPlatformError
403The key lacks the webhooks scope this route needsPlatformError
404No such endpoint in this projectPlatformError
409A request with this Idempotency-Key is still being processedPlatformError
422This Idempotency-Key was already used with a different requestPlatformError

Example

curl -X POST "https://api.trida.lu/core/v1/webhook-endpoints/$ID/test" \
  -H "x-api-key: $TRIDA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

Schemas

Health

FieldTypeRequiredNotes
status"ok" | "degraded"yes
env"local" | "dev" | "prod"yes
versionstringyes
commitstringyes
db"up" | "down"yes
queue"up" | "idle"yes
queueDeadintegeryes
queueFailed24hintegeryes
webhooksDead24hintegeryes
breakersarray of objectyes
lastMigrationstring or nullyes
{
  "status": "ok",
  "env": "local",
  "version": "string",
  "commit": "string",
  "db": "up",
  "queue": "up",
  "queueDead": 0,
  "queueFailed24h": 0,
  "webhooksDead24h": 0,
  "breakers": [
    {
      "provider": "string",
      "state": "closed"
    }
  ],
  "lastMigration": "string"
}

ProjectMe

FieldTypeRequiredNotes
idstring (uuid)yes
slugstringyes
namestringyes
mode"test" | "live"yes
languagesarray of stringyes
themeobjectyes
{
  "id": "2c4d0f3a-7b2e-4a1e-9a7f-1c2d3e4f5a6b",
  "slug": "demo",
  "name": "Démo",
  "mode": "test",
  "languages": [
    "fr",
    "en"
  ],
  "theme": {
    "logoUrl": null,
    "primary": "#23306b",
    "accent": "#c5e6f4",
    "background": "#ffffff",
    "text": "#152f4e"
  }
}

PlatformError

FieldTypeRequiredNotes
code"API_KEY_MISSING" | "API_KEY_INVALID" | "API_KEY_REVOKED" | "SCOPE_MISSING" | "PROJECT_NOT_FOUND" | "NOT_FOUND" | "VALIDATION_FAILED" | "IDEMPOTENCY_KEY_MISSING" | "IDEMPOTENCY_BODY_MISMATCH" | "IDEMPOTENCY_IN_PROGRESS" | "QUOTA_EXCEEDED" | "RATE_LIMITED" | "PROVIDER_ERROR" | "PROVIDER_TIMEOUT" | "PROVIDER_UNAVAILABLE" | "OVERLOADED" | "TIMEOUT" | "INTERNAL"yes
messagestringyes
{
  "code": "API_KEY_INVALID",
  "message": "The API key is not valid."
}

SubjectErased

FieldTypeRequiredNotes
capabilitiesarray of objectyes
{
  "capabilities": [
    {
      "capability": "string",
      "erased": 0
    }
  ]
}

Usage

FieldTypeRequiredNotes
fromstringyespattern ^\d{4}-\d{2}-\d{2}$
tostringyespattern ^\d{4}-\d{2}-\d{2}$
dataarray of objectyes
limitsarray of objectyes
{
  "from": "string",
  "to": "string",
  "data": [
    {
      "day": "string",
      "capability": "string",
      "metric": "string",
      "count": 0
    }
  ],
  "limits": [
    {
      "capability": "string",
      "metric": "string",
      "dailyLimit": 0
    }
  ]
}

WebhookEndpointCreated

FieldTypeRequiredNotes
idstring (uuid)yes
urlstringyes
eventTypesarray of stringyes
activebooleanyes
hasPreviousSecretbooleanyes
createdAtstring (date-time)yes
secretstringyes
{
  "id": "11111111-2222-4333-8444-555555555555",
  "url": "string",
  "eventTypes": [
    "string"
  ],
  "active": true,
  "hasPreviousSecret": true,
  "createdAt": "2026-10-18T10:00:00.000Z",
  "secret": "string"
}

WebhookEndpointList

FieldTypeRequiredNotes
dataarray of objectyes
{
  "data": [
    {
      "id": "11111111-2222-4333-8444-555555555555",
      "url": "string",
      "eventTypes": [
        "string"
      ],
      "active": true,
      "hasPreviousSecret": true,
      "createdAt": "2026-10-18T10:00:00.000Z"
    }
  ]
}

WebhookSecretRotated

FieldTypeRequiredNotes
idstring (uuid)yes
secretstringyes
{
  "id": "11111111-2222-4333-8444-555555555555",
  "secret": "string"
}

WebhookEndpoint

FieldTypeRequiredNotes
idstring (uuid)yes
urlstringyes
eventTypesarray of stringyes
activebooleanyes
hasPreviousSecretbooleanyes
createdAtstring (date-time)yes
{
  "id": "11111111-2222-4333-8444-555555555555",
  "url": "string",
  "eventTypes": [
    "string"
  ],
  "active": true,
  "hasPreviousSecret": true,
  "createdAt": "2026-10-18T10:00:00.000Z"
}

WebhookReplayResult

FieldTypeRequiredNotes
eventIdstring (uuid)yes
deliveriesintegeryesmin 0
{
  "eventId": "11111111-2222-4333-8444-555555555555",
  "deliveries": 0
}

WebhookTestSent

FieldTypeRequiredNotes
eventIdstring (uuid)yes
endpointIdstring (uuid)yes
{
  "eventId": "11111111-2222-4333-8444-555555555555",
  "endpointId": "11111111-2222-4333-8444-555555555555"
}