API Workday.Money

Погодинний облік заробітку з вашої програми: проєкти і ставки, запуск і зупинка роботи, завершення задачі із записом у звіт.

Автор — Дмитро Деулін, засновник Workday.Money. Питання: [email protected].

Договір у машиночитаному вигляді — openapi.yaml, OpenAPI 3.1.

Основне

Величини Гроші — рядок із двома знаками («112.50») і поле 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": []
}

Робота

post /v1/work/start Створює задачу і запускає відлік. Відлік іде за годинником сервера.
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.

post /v1/work/pause Зупиняє відлік без запису. Накопичений час лишається в задачі.
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}.

post /v1/work/finish Записує роботу і вилучає задачу з незавершених. Скасувати не можна.

Заголовок 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; повторне надсилання рядка не виконується.

post /v1/work/{task_id}/trim Задає підсумковий час незавершеної задачі.
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).

patch /v1/work/{task_id} Ліміт оплачуваного часу і позначка «без оплати».
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 час враховується, вартість дорівнює нулю.

get /v1/work Незавершені задачі: ті, що йдуть, призупинені, заведені.

Фільтри: state=running|paused|all, project_id.

Проєкти

get /v1/projects Перелік проєктів.

Фільтр state=active|archived|all, за замовчуванням active.

post /v1/projects Заводить проєкт.
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.

patch /v1/projects/{project_id} Назва, ставка, валюта, вид звітності, архів.

Нова ставка застосовується до роботи, записаної після зміни; вартість записаних відрізків не змінюється. Архівування і повернення — поле state. Вилучення проєкту через API недоступне: DELETE відповідає 405.

Звіти

get /v1/today Підсумки дня за проєктами і валютами.

Параметри: date, timezone.

get /v1/report Записана робота за період.
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"
  }
}
HTTPcodeУмова
400timezone_requiredЗапит, який пише, без поясу; в обліковому записі пояс не збережений
400unknown_fieldПоле, не описане у v1
400idempotency_key_requiredЗавершення без заголовка Idempotency-Key
401key_unknownКлюч не розпізнаний
403plan_limitДосягнуто межу кількості проєктів
404task_not_foundНезавершеної задачі з таким ідентифікатором немає
405method_not_allowedМетод не підтримується для цього шляху
409trim_not_downwardЗапитано збільшення часу
409state_conflictСтан змінено іншим клієнтом
429rate_limitedПеревищено частоту запитів
429quota_exhaustedВитрачено добову квоту
403plan_requiredПотрібен платний тариф або пробний період

Частота запитів

Межі рахуються окремо за видами запитів. У кожній відповіді приходять RateLimit-Limit, RateLimit-Remaining і RateLimit-Reset; за відмови додається Retry-After з кількістю секунд.

ЗапитиЗа хвилинуСплеск
Читання, крім звіту120240
Робота: запуск, пауза, завершення, правка, зменшення3060
Звіт за період1020
Створення і правка проєктів1020
Усе разом за обліковим записом300

Відмова за частотою повертає 429 rate_limited і ніколи не означає частково виконаної роботи: перевірка стоїть до дії.

Тариф і добова квота

Доступ до API і до підключення MCP входить у тариф Pro та в пробний період. Без них — 403 plan_required; облік у самому застосунку при цьому працює як раніше.

ЗапитиPro, на добуПробний, на добуПробний, за період
Читання8002002500
Робота20060700
Звіт20670
Проєкти10310

Квота рахується за обліковим записом, а не за ключем, і обнуляється опівночі за вашим часовим поясом. Звіт списується за обсягом: кожні 500 прочитаних відрізків — одиниця квоти. Робоча корзина має запас у 10 дій понад добову: розпочате завершення задачі завжди доходить до кінця.

Залишок на сьогодні приходить у заголовках Quota-Limit, Quota-Remaining, Quota-Reset і повністю — у GET /v1/me, поле quota.

Не входить у v1

Агент замість коду

Той самий облік доступний AI-асистенту напряму, командами природною мовою: під’єднання AI-агента за MCP.

Рахуй зароблене, а не витрачене

Один проєкт безкоштовно назавжди. Картка не потрібна, налаштування займає пів хвилини.

Почати безкоштовно