{"openapi":"3.1.0","info":{"title":"Wayfin API","version":"1.0","description":"AI-agent-friendly API for Wayfin task coordination. Human-readable guide: https://www.wayfin.eu/api/v1/docs","contact":{"email":"support@leanex.fi"}},"servers":[{"url":"https://www.wayfin.eu/api/v1"}],"security":[{"bearerAuth":[]}],"paths":{"/":{"get":{"summary":"API index and links","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"name":"Wayfin API","version":"v1"}}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"security":[]}},"/docs":{"get":{"summary":"Agent documentation as markdown (text/markdown)","responses":{"200":{"description":"Success","content":{"application/json":{"example":"# Wayfin API v1 …"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"security":[]}},"/openapi.json":{"get":{"summary":"This OpenAPI 3.1 document","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"openapi":"3.1.0"}}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"security":[]}},"/me":{"get":{"summary":"Identity, plan, key capabilities and quotas of the token's account","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"user":{"name":"Teemu Toivonen","email":"teemu@example.com","locale":"fi","time_zone":"Helsinki"},"token":{"name":"Reporting bot","hint":"wf_7Kq2…9fPz","permission":"read","collection_scope":"selected","collections":{"count":1,"truncated":false,"selected":[{"id":42,"name":"Integraatioprojekti","link":"https://wayfin.eu/api/v1/collections/42"}]}},"plan":{"id":"pro","source":"manual","expires_on":null},"email_verified":true,"quotas":{"tracked_tasks":{"used":12,"limit":null},"collections":{"used":3,"limit":null}},"links":{"collections":"https://wayfin.eu/api/v1/collections","docs":"https://wayfin.eu/api/v1/docs"}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"description":"The token.collections object is conditional: selected is null for an all-scope key (no fixed list exists — read GET /collections instead) and an array for a selected-scope key. That array holds at most 25 entries; when the key is scoped to more, truncated is true while count still reports the real total. A null list never means \"no collections\"."}},"/collections":{"get":{"summary":"Owned task collections with status summaries","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"collections":[{"id":42,"name":"Integraatioprojekti","description":"Asiakkaan integraation koordinointi","verdict":{"state":"amber","variant":"amber"},"risk_level":2,"counts":{"completed":4,"in_followup":6,"not_started":1,"awaiting_acceptance":2,"awaiting_signoff":0,"unassigned_drafts":1,"overdue":1,"escalations":0,"decision_pending":0},"response_rate_30d":85,"estimated_completion_on":"2026-10-31","created_at":"2026-06-01T10:00:00+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42","tasks":"https://wayfin.eu/api/v1/collections/42/tasks","status":"https://wayfin.eu/api/v1/collections/42/status"}}]}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}}}},"/collections/{id}":{"get":{"summary":"Collection detail incl. sections","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"collection":{"id":42,"name":"Integraatioprojekti","description":"Asiakkaan integraation koordinointi","verdict":{"state":"amber","variant":"amber"},"risk_level":2,"counts":{"completed":4,"in_followup":6,"not_started":1,"awaiting_acceptance":2,"awaiting_signoff":0,"unassigned_drafts":1,"overdue":1,"escalations":0,"decision_pending":0},"response_rate_30d":85,"estimated_completion_on":"2026-10-31","created_at":"2026-06-01T10:00:00+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42","tasks":"https://wayfin.eu/api/v1/collections/42/tasks","status":"https://wayfin.eu/api/v1/collections/42/status"},"default_escalation_threshold":2,"action_note":null,"sections":[{"id":12,"title":"Myynti","position":1}]}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"}]}},"/collections/{id}/status":{"get":{"summary":"Counts, verdict, risk and attention lists","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"collection":{"id":42,"name":"Integraatioprojekti"},"date":"2026-08-18","verdict":{"state":"amber","variant":"amber"},"counts":{"completed":4,"in_followup":6,"overdue":1},"risk":{"level":2,"effective_distribution":{"2":4,"3":3},"elevated":2,"causes":{"dependencies":2}},"attention":{"silent_tasks":{"items":[{"task_id":117,"name":"…","phase":"reminder","silent_days":4,"reminders_sent":1}],"truncated":false}}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"}]}},"/collections/{id}/escalations":{"get":{"summary":"Unresolved escalations and decision-pending tasks","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"unresolved":[{"task_id":117,"task_name":"…","assignee_name":"Maija Meikäläinen","triggered_on":"2026-08-15","missed_count":2,"days_open":3,"contact_notified":false}],"decision_pending":[]}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"}]}},"/collections/{id}/risks":{"get":{"summary":"Effective risk per task with causes","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"risk_level":3,"elevated_count":1,"causes":{"dependencies":1},"high_risk_tasks":[{"task_id":117,"effective_risk":4,"elevated":false,"factors":{"escalated":true,"decision_pending":false,"overdue":true,"reported_confidence":3}},{"task_id":118,"effective_risk":3,"elevated":true,"factors":{"escalated":false,"decision_pending":false,"overdue":false,"reported_confidence":3}}]}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"}],"description":"elevated_count and causes describe one set: effective risk 3-4 and not overdue (the same rule the UI counts as elevated). high_risk_tasks covers the same task cohort (active and awaiting sign-off) and is wider only towards overdue work — an overdue level-4 task stays on the list with elevated: false, and its cause is not tallied into causes. Every task behind elevated_count appears as a row with elevated: true, so causes can be reconstructed from the rows."}},"/collections/{id}/tasks":{"get":{"summary":"Task list; filters: state, starred, overdue, escalated, section_id, assignee_email; cursor: after_id + limit","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"tasks":[{"id":117,"name":"Deliver the security review","state":"draft","starred":false,"section_id":12,"assignee":{"name":"Maija Meikäläinen","email":"maija@example.org","locale":"fi"},"due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","overdue":false,"cadence":{"kind":"weekly","weekdays":[],"reporting_weekday":null},"completion_policy":"self_complete","latest_report":{"confidence":2,"risk_causes":[],"primary_cause":null,"comment":"On track","marked_done":false,"reported_at":"2026-08-14T09:12:00+03:00","seen_at":null},"attention":{"escalated":false,"decision_pending":false,"reminders_paused_until":null,"snoozed_until":null},"created_at":"2026-08-10T12:00:00+03:00","updated_at":"2026-08-14T09:12:00.123456+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42/tasks/117","web":"https://wayfin.eu/collections/42/tasks/117"}}],"pagination":{"limit":50,"has_more":false,"next_after_id":null}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"},{"name":"state","in":"query","schema":{"type":"string","enum":["draft","pending_acceptance","change_requested","rejected","active","pending_completion_approval","completed","halted","closed_not_done"]}},{"name":"starred","in":"query","schema":{"type":"boolean"}},{"name":"overdue","in":"query","schema":{"type":"boolean"}},{"name":"escalated","in":"query","schema":{"type":"boolean"}},{"name":"section_id","in":"query","schema":{"type":"integer"}},{"name":"assignee_email","in":"query","schema":{"type":"string"}},{"name":"after_id","in":"query","schema":{"type":"integer","minimum":1},"description":"Cursor: return tasks with id greater than this. Order is always id ASC. Non-integer values are a 400 error."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}]},"post":{"summary":"Create a task — always lands as a draft; no email is sent","responses":{"201":{"description":"Success","content":{"application/json":{"example":{"task":{"id":117,"name":"Deliver the security review","state":"draft","starred":false,"section_id":12,"assignee":{"name":"Maija Meikäläinen","email":"maija@example.org","locale":"fi"},"due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","overdue":false,"cadence":{"kind":"weekly","weekdays":[],"reporting_weekday":null},"completion_policy":"self_complete","latest_report":{"confidence":2,"risk_causes":[],"primary_cause":null,"comment":"On track","marked_done":false,"reported_at":"2026-08-14T09:12:00+03:00","seen_at":null},"attention":{"escalated":false,"decision_pending":false,"reminders_paused_until":null,"snoozed_until":null},"created_at":"2026-08-10T12:00:00+03:00","updated_at":"2026-08-14T09:12:00.123456+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42/tasks/117","web":"https://wayfin.eu/collections/42/tasks/117"}}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"403":{"description":"Read-only key (insufficient_permissions) or plan/verification gate","content":{"application/json":{"example":{"error":{"code":"insufficient_permissions","message":"This API key is read-only, so it cannot create or change anything.","status":403,"hint":"GET endpoints work normally. For writes, a human must create a key with write access in Wayfin: Account → API keys (https://wayfin.eu/account). Do not retry with this key.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#authentication"}}}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[ -~]+$"},"description":"One printable-ASCII key per logical task creation (a UUID is recommended)"}],"description":"Send an Idempotency-Key to make retries safe. A replay returns the original status and body with Idempotency-Replayed: true. A request rejected before the key is claimed (unknown section_id) does not consume the key — retry the corrected payload with the same key.","requestBody":{"required":true,"content":{"application/json":{"example":{"name":"Deliver the security review","assignee_name":"Maija Meikäläinen","assignee_email":"maija@example.org","due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","cadence_kind":"weekly"}}}}}},"/collections/{id}/tasks/{task_id}":{"get":{"summary":"Task detail incl. readiness, reports, events","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"task":{"id":117,"name":"Deliver the security review","state":"draft","starred":false,"section_id":12,"assignee":{"name":"Maija Meikäläinen","email":"maija@example.org","locale":"fi"},"due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","overdue":false,"cadence":{"kind":"weekly","weekdays":[],"reporting_weekday":null},"completion_policy":"self_complete","latest_report":{"confidence":2,"risk_causes":[],"primary_cause":null,"comment":"On track","marked_done":false,"reported_at":"2026-08-14T09:12:00+03:00","seen_at":null},"attention":{"escalated":false,"decision_pending":false,"reminders_paused_until":null,"snoozed_until":null},"created_at":"2026-08-10T12:00:00+03:00","updated_at":"2026-08-14T09:12:00.123456+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42/tasks/117","web":"https://wayfin.eu/collections/42/tasks/117"},"readiness":{"ready_to_send":false,"state_allows_sending":true,"assignee_locked":false,"blocking_issues":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}]}}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Task id"}]},"patch":{"summary":"Update a not-yet-sent task (draft/change_requested/rejected). Optional expected_updated_at guards against concurrent edits","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"task":{"id":117,"name":"Deliver the security review","state":"draft","starred":false,"section_id":12,"assignee":{"name":"Maija Meikäläinen","email":"maija@example.org","locale":"fi"},"due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","overdue":false,"cadence":{"kind":"weekly","weekdays":[],"reporting_weekday":null},"completion_policy":"self_complete","latest_report":{"confidence":2,"risk_causes":[],"primary_cause":null,"comment":"On track","marked_done":false,"reported_at":"2026-08-14T09:12:00+03:00","seen_at":null},"attention":{"escalated":false,"decision_pending":false,"reminders_paused_until":null,"snoozed_until":null},"created_at":"2026-08-10T12:00:00+03:00","updated_at":"2026-08-14T09:12:00.123456+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42/tasks/117","web":"https://wayfin.eu/collections/42/tasks/117"}}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"403":{"description":"Read-only key (insufficient_permissions) or plan/verification gate","content":{"application/json":{"example":{"error":{"code":"insufficient_permissions","message":"This API key is read-only, so it cannot create or change anything.","status":403,"hint":"GET endpoints work normally. For writes, a human must create a key with write access in Wayfin: Account → API keys (https://wayfin.eu/account). Do not retry with this key.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#authentication"}}}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Task id"}],"requestBody":{"required":true,"content":{"application/json":{"example":{"due_on":"2026-10-15","expected_updated_at":"2026-08-14T09:12:00.123456+03:00"}}}}}},"/collections/{id}/tasks/{task_id}/send_invitation":{"post":{"summary":"Send (or idempotently re-check) the invitation email to the doer","responses":{"200":{"description":"Success","content":{"application/json":{"example":{"task":{"id":117,"name":"Deliver the security review","state":"pending_acceptance","starred":false,"section_id":12,"assignee":{"name":"Maija Meikäläinen","email":"maija@example.org","locale":"fi"},"due_on":"2026-09-30","follow_up_starts_on":"2026-09-05","overdue":false,"cadence":{"kind":"weekly","weekdays":[],"reporting_weekday":null},"completion_policy":"self_complete","latest_report":{"confidence":2,"risk_causes":[],"primary_cause":null,"comment":"On track","marked_done":false,"reported_at":"2026-08-14T09:12:00+03:00","seen_at":null},"attention":{"escalated":false,"decision_pending":false,"reminders_paused_until":null,"snoozed_until":null},"created_at":"2026-08-10T12:00:00+03:00","updated_at":"2026-08-14T09:12:00.123456+03:00","links":{"self":"https://wayfin.eu/api/v1/collections/42/tasks/117","web":"https://wayfin.eu/collections/42/tasks/117"}},"invitation":{"already_sent":false,"sent_to":"maija@example.org","delivery_state":"pending","note":"The invitation email is queued for delivery."}}}},"headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Request limit of the currently tightest window"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in that window — pace yourself before this hits zero"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp (seconds) when the window resets"}}},"403":{"description":"Read-only key (insufficient_permissions) or plan/verification gate","content":{"application/json":{"example":{"error":{"code":"insufficient_permissions","message":"This API key is read-only, so it cannot create or change anything.","status":403,"hint":"GET endpoints work normally. For writes, a human must create a key with write access in Wayfin: Account → API keys (https://wayfin.eu/account). Do not retry with this key.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#authentication"}}}}},"default":{"description":"Error (shared shape, see docs#errors)","content":{"application/json":{"example":{"error":{"code":"validation_failed","message":"The task is missing required information for sending the invitation.","status":422,"errors":[{"field":"due_on","code":"missing","message":"Deadline can't be blank","description":"Deadline date, format YYYY-MM-DD. Required before sending. Ask the human if unknown — do not invent a deadline.","example":"2026-09-30"}],"hint":"Fill the listed fields with PATCH, then retry.","retryable":false,"docs_url":"https://wayfin.eu/api/v1/docs#fields"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Collection id"},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Task id"}]}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal API key (wf_… prefix), created in Account → API keys. Pro plan only. Each key carries a permission (write or read) and a collection scope (all or selected) chosen by the human who created it — GET /me tells you this key's limits."}}}}