Почасовой учёт заработка из вашей программы: проекты и ставки, запуск и остановка работы, завершение задачи с записью в отчёт.
Автор — Дмитрий Деулин, основатель Workday.Money. Вопросы: [email protected].
Договор в машиночитаемом виде — openapi.yaml, OpenAPI 3.1.
currency рядом. Суммы разных валют не складываются: итоги приходят списком по валютам. Время — целые секунды, поля *_seconds. Даты работы — ГГГГ-ММ-ДД, моменты времени — ISO 8601 с Z.
timezone (Europe/Kyiv) или utc_offset_minutes. Если пояс не передан и не сохранён у аккаунта — 400 timezone_required.
{"data": …, "warnings": […]}, отказ — {"error": {…}}. Поле warnings присутствует всегда.
Выдаётся в приложении: меню → AI-агент и API → Создать ключ. Показывается один раз. Ключей можно завести несколько и отзывать по отдельности. Передаётся заголовком Authorization.
curl https://api.workday.money/v1/me \
-H "Authorization: Bearer wdm_live_YOUR_KEY"
{
"data": {
"account_id": "acc_9f2b7c1d4e0a",
"email": "[email protected]",
"plan": "free",
"project_limit": 1,
"projects_used": 1,
"timezone_known": true,
"scopes": ["work.read", "work.write", "projects.read", "projects.write"]
},
"warnings": []
}
curl -X POST https://api.workday.money/v1/work/start \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "3Kq1xYt0aB",
"title": "Export review",
"limit_seconds": 7200,
"timezone": "Europe/Kyiv"
}'
{
"data": {
"task": {
"id": "0c1b7f22-9a44-4f1e-8c2d-7b3a1e5d0f88",
"project_id": "3Kq1xYt0aB",
"title": "Export review",
"state": "running",
"earned": "0.00",
"currency": "USD",
"elapsed_seconds": 0,
"limit_seconds": 7200,
"started_at": "2026-08-12T08:41:02Z"
}
},
"warnings": []
}
Повтор с тем же названием в том же проекте возвращает существующую задачу с предупреждением task_exists.
Поле on_running задаёт поведение, если другая задача уже идёт: allow (по умолчанию), pause_others, reject.
curl -X POST https://api.workday.money/v1/work/pause \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"task_id": "0c1b7f22-9a44-4f1e-8c2d-7b3a1e5d0f88", "timezone": "Europe/Kyiv"}'
Остановить все задачи — {"all": true}.
Заголовок Idempotency-Key обязателен. Повтор с тем же ключом возвращает прежний ответ без повторной записи. Ключ хранится 90 дней.
curl -X POST https://api.workday.money/v1/work/finish \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Idempotency-Key: 2f1c9d5a-4b7e-4a0f-9c31-1e6f0a2b7c34" \
-H "Content-Type: application/json" \
-d '{"task_id": "0c1b7f22-9a44-4f1e-8c2d-7b3a1e5d0f88", "timezone": "Europe/Kyiv"}'
{
"data": {
"finished": {
"task_id": "0c1b7f22-9a44-4f1e-8c2d-7b3a1e5d0f88",
"project_id": "3Kq1xYt0aB",
"earned": "45.00",
"currency": "USD",
"billable_seconds": 3600,
"actual_seconds": 3720,
"entries": [
{
"id": "0c1b7f22-9a44-4f1e-8c2d-7b3a1e5d0f88_2026-08-12",
"work_date": "2026-08-12",
"earned": "45.00",
"currency": "USD",
"billable_seconds": 3600,
"actual_seconds": 3720
}
]
}
},
"warnings": []
}
Записывается по одному отрезку на каждый календарный день работы. Если к проекту подключена таблица и строка в неё не записана, в warnings приходит sheet_not_written с перечнем entry_ids; повторная отправка строки не выполняется.
curl -X POST https://api.workday.money/v1/work/0c1b7f22…/trim \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"remaining_seconds": 1800}'
Значение должно быть меньше текущего: увеличение недоступно (409 trim_not_downward). Задача должна быть остановлена (409 task_running).
curl -X PATCH https://api.workday.money/v1/work/0c1b7f22… \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"limit_seconds": 0, "unpaid": true}'
Время сверх лимита записывается, но не оплачивается. limit_seconds: 0 снимает лимит. При unpaid время учитывается, стоимость равна нулю.
Фильтры: state=running|paused|all, project_id.
Фильтр state=active|archived|all, по умолчанию active.
curl -X POST https://api.workday.money/v1/projects \
-H "Authorization: Bearer wdm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme — integration",
"rate": "45.00",
"currency": "USD",
"report": { "period": "month" },
"timezone": "Europe/Kyiv"
}'
Повтор с тем же названием возвращает существующий проект с предупреждением project_exists.
Новая ставка применяется к работе, записанной после изменения; стоимость записанных отрезков не меняется. Архивирование и возврат — поле state. Удаление проекта через API недоступно: DELETE отвечает 405.
Параметры: date, timezone.
curl "https://api.workday.money/v1/report?from=2026-08-01&to=2026-08-12&project_id=3Kq1xYt0aB" \
-H "Authorization: Bearer wdm_live_YOUR_KEY"
Постранично: limit до 1000, следующая страница — по next_cursor из ответа.
Разбирайте отказы по полю code. Поле message — пояснение на английском, может изменяться. retryable показывает, имеет ли смысл повтор.
{
"error": {
"code": "plan_limit",
"message": "Project limit reached for this plan",
"details": { "plan": "free", "project_limit": 1, "projects_used": 1 },
"retryable": false,
"doc": "https://workday.money/api/errors#plan_limit",
"request_id": "req_01J8ZK7QB2V8Y"
}
}
| HTTP | code | Условие |
|---|---|---|
| 400 | timezone_required | Пишущий запрос без пояса, у аккаунта пояс не сохранён |
| 400 | unknown_field | Поле, не описанное в v1 |
| 400 | idempotency_key_required | Завершение без заголовка Idempotency-Key |
| 401 | key_unknown | Ключ не распознан |
| 403 | plan_limit | Достигнут предел числа проектов |
| 404 | task_not_found | Незавершённой задачи с таким идентификатором нет |
| 405 | method_not_allowed | Метод не поддерживается для этого пути |
| 409 | trim_not_downward | Запрошено увеличение времени |
| 409 | state_conflict | Состояние изменено другим клиентом |
| 429 | rate_limited | Превышена частота запросов |
| 429 | quota_exhausted | Израсходована суточная квота |
| 403 | plan_required | Нужен платный тариф или пробный период |
Пределы считаются раздельно по видам запросов. В каждом ответе приходят RateLimit-Limit, RateLimit-Remaining и RateLimit-Reset; при отказе добавляется Retry-After с числом секунд.
| Запросы | В минуту | Всплеск |
|---|---|---|
| Чтение, кроме отчёта | 120 | 240 |
| Работа: запуск, пауза, завершение, правка, уменьшение | 30 | 60 |
| Отчёт за период | 10 | 20 |
| Создание и правка проектов | 10 | 20 |
| Всё вместе по учётной записи | 300 | — |
Отказ по частоте возвращает 429 rate_limited и никогда не означает частично выполненной работы: проверка стоит до действия.
Доступ к API и к подключению MCP входит в тариф Pro и в пробный период. Без них — 403 plan_required; учёт в самом приложении при этом работает как прежде.
| Запросы | Pro, в сутки | Пробный, в сутки | Пробный, за период |
|---|---|---|---|
| Чтение | 800 | 200 | 2500 |
| Работа | 200 | 60 | 700 |
| Отчёт | 20 | 6 | 70 |
| Проекты | 10 | 3 | 10 |
Квота считается по учётной записи, а не по ключу, и обнуляется в полночь по вашему часовому поясу. Отчёт списывается по объёму: каждые 500 прочитанных отрезков — единица квоты. Рабочая корзина имеет запас в 10 действий сверх суточной: начатое завершение задачи всегда доходит до конца.
Остаток на сегодня приходит в заголовках Quota-Limit, Quota-Remaining, Quota-Reset и целиком — в GET /v1/me, поле quota.
Тот же учёт доступен ИИ-ассистенту напрямую, командами на естественном языке: подключение AI-агента по MCP.
Один проект бесплатно навсегда. Карта не нужна, настройка занимает полминуты.
Начать бесплатно