{"service":"attribution-service","version":"0.1.0","endpoints":[{"code":"info","method":"GET","path":"/","description":"Список всех ручек сервиса с описанием."},{"code":"health","method":"GET","path":"/health","description":"Healthcheck. Возвращает {status: ok}."},{"code":"ready","method":"GET","path":"/ready","description":"Readiness-проба: 200 — нода готова принимать задачи, 503 — не готова (не отвечает Redis-брокер). Для gate роллинг-деплоя и docker healthcheck. ClickHouse сюда намеренно не входит."},{"code":"fill_utm","method":"POST","path":"/fill-utm","description":"Ставит таску бэкфилла utm_source/utm_full из attribution_dist в enjoylix_registers_dist для одного проекта. Тело JSON: {project, days_back?, limit?, platform_id?, is_enjoylix?, callback_url?}. is_enjoylix: 1 (enjoylix_registers_dist) | 0 (registers_dist). Требует заголовок X-Signature = HMAC-SHA256(secret, canonical_body). Возвращает 202 + task_id. Идемпотентна на уровне строки (фильтр utm_source='')."},{"code":"task_status","method":"GET","path":"/tasks/{task_id}","description":"Статус Celery-таски. Возвращает {task_id, status, result?, error?}. status ∈ {pending, started, retry, success, error}."}]}