Погодинний облік заробітку з вашої програми: проєкти і ставки, запуск і зупинка роботи, завершення задачі із записом у звіт.
Автор — Дмитро Деулін, засновник 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-асистенту напряму, командами природною мовою: під’єднання AI-агента за MCP.
Один проєкт безкоштовно назавжди. Картка не потрібна, налаштування займає пів хвилини.
Почати безкоштовно