Skip to content

REST API

Documentation index for AI agents: https://angelwood.io/docs/llms.txt

The Angelwood API lets you read clients, projects, tasks and invoices in your organization, and create clients and tasks. Nothing can be updated or deleted through the API.

  • Base URL: https://angelwood-api-uzil.onrender.com/api/v1
  • OpenAPI description: https://angelwood-api-uzil.onrender.com/api/v1/openapi.json
  • Format: JSON requests and responses

Authentication

Create an API key in Angelwood under Settings. Choose the permission the key needs:

Permission Allows
Read Every GET endpoint
Write Read, plus creating clients and tasks
Admin The same as write in this API

Send the key in the Authorization header on every request:

curl https://angelwood-api-uzil.onrender.com/api/v1/me \
  -H "Authorization: Bearer sk_live_your_key"

A key acts inside the one organization it was created in. It stops working when it is revoked, when it expires, or when the person who created it is no longer an active member of the organization. Members with the viewer or commenter role cannot create anything, whatever permission their key has.

Lists and paging

List endpoints return the newest records first, in this shape:

{
  "data": [],
  "total": 42,
  "has_more": true,
  "next_offset": 25
}
Parameter Meaning
limit How many records to return, from 1 to 100. The default is 25.
offset How many records to skip. Pass next_offset from the previous page.
created_after Only records created after this ISO 8601 time, for example 2026-03-31T00:00:00Z.

To pick up new records on a schedule, call a list endpoint with created_after set to the time of your previous call.

Endpoints

GET /me

Tests the key. Returns the organization and user it belongs to, the user's role and the key's permissions.

GET /clients

Lists active clients. Optional parameters: search (matches name or email), created_after, limit, offset.

GET /clients/{client_id}

Returns one client.

POST /clients

Creates a client. Needs write permission.

Field Required Notes
name Yes Up to 200 characters
email No Two active clients cannot share an email address
phone No
address No
curl -X POST https://angelwood-api-uzil.onrender.com/api/v1/clients \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Ltd", "email": "[email protected]"}'

GET /projects

Lists projects. Optional parameters: client_id, status (active, completed, on_hold, cancelled), created_after, limit, offset.

GET /tasks

Lists tasks. Optional parameters: project_id, status (todo, in_progress, completed, blocked), created_after, completed_after, limit, offset.

With status=completed or completed_after, the most recently completed task comes first.

POST /tasks

Adds a task to a project. Needs write permission.

Field Required Notes
project_id Yes A project in your organization
title Yes Up to 500 characters
description No
priority No low, medium, high or critical. The default is medium.
due_date No ISO 8601 time

GET /invoices

Lists invoices. Optional parameters: client_id, project_id, status (draft, sent, paid, overdue, partially_paid, refunded, partially_refunded, cancelled), created_after, paid_after, limit, offset.

Each invoice includes amount, amount_paid (the sum of completed payments), balance_due and currency. With status=paid or paid_after, the most recently paid invoice comes first.

Errors

Errors use the HTTP status code and this body:

{
  "error": {
    "code": "INVALID_API_KEY",
    "message": "Invalid, revoked or expired API key"
  }
}
Status Meaning
400 The request was not valid. details says which field.
401 The key is missing, invalid, revoked or expired.
403 The key or its owner is not allowed to do this.
404 The record does not exist in your organization.
409 The record conflicts with an existing one, such as a client with the same email.
429 Too many requests.

Rate limit

120 requests per minute per organization. Responses carry the standard RateLimit headers.

View this page as Markdown