Owlmetry
API Reference

Projects

CRUD endpoints for managing projects — create, list, get, update, and delete projects within teams.

Create, list, get, update, and delete projects. Projects group related apps across platforms (e.g., a "MyApp" project containing iOS, Android, and web apps).

GET /v1/projects

List all projects the caller has access to.

Auth required: Yes (projects:read permission or JWT)

ParameterTypeDescription
team_idstringOptional. Filter to a specific team.
// Response (200)
{
  "projects": [
    {
      "id": "uuid",
      "team_id": "uuid",
      "name": "My App",
      "slug": "my-app",
      "color": "#22c55e",
      "retention_days_events": null,
      "retention_days_metrics": null,
      "retention_days_funnels": null,
      "effective_retention_days_events": 120,
      "effective_retention_days_metrics": 365,
      "effective_retention_days_funnels": 365,
      "attachment_user_quota_bytes": null,
      "attachment_project_quota_bytes": null,
      "effective_attachment_user_quota_bytes": 262144000,
      "effective_attachment_project_quota_bytes": 5368709120,
      "issue_alert_frequency": null,
      "effective_issue_alert_frequency": "daily",
      "created_at": "2024-01-01T00:00:00.000Z"
    }
  ]
}

GET /v1/projects/:id

Get a single project with its apps.

Auth required: Yes (projects:read permission or JWT)

// Response (200)
{
  "id": "uuid",
  "team_id": "uuid",
  "name": "My App",
  "slug": "my-app",
  "color": "#22c55e",
  "retention_days_events": null,
  "retention_days_metrics": null,
  "retention_days_funnels": null,
  "effective_retention_days_events": 120,
  "effective_retention_days_metrics": 365,
  "effective_retention_days_funnels": 365,
  "attachment_user_quota_bytes": null,
  "attachment_project_quota_bytes": null,
  "effective_attachment_user_quota_bytes": 262144000,
  "effective_attachment_project_quota_bytes": 5368709120,
  "issue_alert_frequency": null,
  "effective_issue_alert_frequency": "daily",
  "created_at": "2024-01-01T00:00:00.000Z",
  "apps": [
    {
      "id": "uuid",
      "team_id": "uuid",
      "project_id": "uuid",
      "name": "iOS App",
      "platform": "apple",
      "bundle_id": "com.example.myapp",
      "client_secret": "owl_client_abc123...",
      "created_at": "2024-01-01T00:00:00.000Z"
    }
  ]
}

POST /v1/projects

Create a new project within a team.

Auth required: Yes (projects:write permission or JWT, admin role required)

// Request
{
  "team_id": "uuid",
  "name": "My App",
  "slug": "my-app",
  "retention_days_events": 90
}

// Response (201)
{
  "id": "uuid",
  "team_id": "uuid",
  "name": "My App",
  "slug": "my-app",
  "color": "#22c55e",
  "retention_days_events": 90,
  "retention_days_metrics": null,
  "retention_days_funnels": null,
  "effective_retention_days_events": 90,
  "effective_retention_days_metrics": 365,
  "effective_retention_days_funnels": 365,
  "created_at": "2024-01-01T00:00:00.000Z"
}

A display color is auto-assigned on creation (picked from a palette of unused colors within the team). Use PATCH to override it. The request body does not accept color.

Field reference

FieldTypeRequiredDescription
team_idstringYesThe team this project belongs to.
namestringYesDisplay name.
slugstringYesURL-friendly identifier. Must match ^[a-z0-9-]+$. Unique within a team.
retention_days_eventsintegerNoDays to retain events. Default: 120.
retention_days_metricsintegerNoDays to retain metric events. Default: 365.
retention_days_funnelsintegerNoDays to retain funnel events. Default: 365.

Slug reuse: if a soft-deleted project exists with the same slug in the same team, it is hard-deleted to free the slug.

Returns 409 if an active project with the same slug already exists.

PATCH /v1/projects/:id

Update a project's name, color, or data retention policies.

Auth required: Yes (projects:write permission or JWT, admin role required)

FieldTypeRequiredDescription
namestringNoNew display name.
colorstringNoDisplay color as #RRGGBB hex. Auto-assigned on creation; override to customize.
retention_days_eventsinteger or nullNoDays to retain events. null resets to default (120).
retention_days_metricsinteger or nullNoDays to retain metric events. null resets to default (365).
retention_days_funnelsinteger or nullNoDays to retain funnel events. null resets to default (365).
attachment_user_quota_bytesinteger or nullNoPer-user attachment storage quota in bytes. null resets to default (250 MB).
attachment_project_quota_bytesinteger or nullNoProject-wide attachment storage quota in bytes. null resets to default (5 GB).
issue_alert_frequencystring or nullNoIssue notification cadence: none, hourly, 6_hourly, daily, or weekly. null resets to default (daily).

At least one field must be provided.

// Request
{
  "name": "Renamed Project",
  "retention_days_events": 60
}

// Response (200)
{
  "id": "uuid",
  "team_id": "uuid",
  "name": "Renamed Project",
  "slug": "my-app",
  "color": "#22c55e",
  "retention_days_events": 60,
  "retention_days_metrics": null,
  "retention_days_funnels": null,
  "effective_retention_days_events": 60,
  "effective_retention_days_metrics": 365,
  "effective_retention_days_funnels": 365,
  "created_at": "2024-01-01T00:00:00.000Z"
}

DELETE /v1/projects/:id

Soft-delete a project and cascade to its apps, API keys, metric definitions, and funnel definitions.

Auth required: Yes (JWT only, admin role required. Agent keys receive 403.)

// Response (200)
{
  "deleted": true
}

Ready to get started?

Connect your agent via MCP or CLI and start tracking.