{"openapi": "3.1.0", "info": {"title": "Liferafts API", "version": "1.0.0", "description": ""}, "paths": {"/api/v1/me": {"get": {"operationId": "core_api_routers_me_me", "summary": "The authenticated user", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MeSchema"}}}}}, "tags": ["me"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics": {"get": {"operationId": "core_api_routers_metrics_list_metrics", "summary": "List metrics", "parameters": [{"in": "query", "name": "goal_id", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Goal Id"}, "required": false}, {"in": "query", "name": "kind", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Kind"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedMetricOut"}}}}}, "tags": ["metrics"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics/{metric_id}": {"get": {"operationId": "core_api_routers_metrics_get_metric_detail", "summary": "A single metric", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MetricDetailOut"}}}}}, "tags": ["metrics"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics/{metric_id}/values": {"get": {"operationId": "core_api_routers_metrics_list_values", "summary": "List values", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}, {"in": "query", "name": "from", "schema": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "From"}, "required": false}, {"in": "query", "name": "to", "schema": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "To"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedValueOut"}}}}}, "tags": ["metrics"], "security": [{"ApiKeyAuth": []}]}, "post": {"operationId": "core_api_routers_metrics_create_value", "summary": "Record a value", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValueOut"}}}}}, "tags": ["metrics"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValueIn"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics/{metric_id}/values/bulk": {"post": {"operationId": "core_api_routers_metrics_bulk_values", "summary": "Backfill many values", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BulkResultOut"}}}}}, "description": "Backfill.\n\n``replace`` is one row per date, last write wins \u2014 the right mode for an\nidempotent sync that may resend the same window. ``append`` adds a row per\nentry, which is what a ``sum`` metric wants.\n\nEntries are validated first and reported per index; the write itself is\nall-or-nothing, so a caller never has to reason about a half-applied\nbatch. An entry with a null value clears that date in ``replace`` mode and\nis an error in ``append`` mode, where there is nothing to clear.\n\nIn ``replace`` mode a repeated date resolves to its last entry, so a\nbatch behaves the same as sending its entries one at a time.", "tags": ["metrics"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BulkIn"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics/{metric_id}/values/{value_id}": {"patch": {"operationId": "core_api_routers_metrics_update_value", "summary": "Edit a value", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}, {"in": "path", "name": "value_id", "schema": {"title": "Value Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValueOut"}}}}}, "tags": ["metrics"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValuePatch"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}, "delete": {"operationId": "core_api_routers_metrics_delete_value", "summary": "Delete a value", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}, {"in": "path", "name": "value_id", "schema": {"title": "Value Id", "type": "integer"}, "required": true}], "responses": {"204": {"description": "No Content"}}, "tags": ["metrics"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/metrics/{metric_id}/marks/{entry_date}": {"put": {"operationId": "core_api_routers_metrics_set_mark", "summary": "Set a daily habit mark", "parameters": [{"in": "path", "name": "metric_id", "schema": {"title": "Metric Id", "type": "integer"}, "required": true}, {"in": "path", "name": "entry_date", "schema": {"format": "date", "title": "Entry Date", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MarkOut"}}}}}, "description": "Tick or untick a daily habit.\n\nIdempotent, so a sync can assert the state it wants without reading first.", "tags": ["metrics"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/MarkIn"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/api/v1/posts": {"get": {"operationId": "core_api_routers_posts_list_posts", "summary": "List posts", "parameters": [{"in": "query", "name": "group_id", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Group Id"}, "required": false}, {"in": "query", "name": "author_id", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Author Id"}, "required": false}, {"in": "query", "name": "tag", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Tag"}, "required": false}, {"in": "query", "name": "type", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Type"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedPostOut"}}}}}, "tags": ["posts"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/groups/{group_uuid}/posts": {"get": {"operationId": "core_api_routers_posts_list_group_posts", "summary": "Posts in one group", "parameters": [{"in": "path", "name": "group_uuid", "schema": {"title": "Group Uuid", "type": "string"}, "required": true}, {"in": "query", "name": "author_id", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Author Id"}, "required": false}, {"in": "query", "name": "tag", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Tag"}, "required": false}, {"in": "query", "name": "type", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Type"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedPostOut"}}}}}, "tags": ["posts"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/posts/{post_id}": {"get": {"operationId": "core_api_routers_posts_get_post_detail", "summary": "A single post", "parameters": [{"in": "path", "name": "post_id", "schema": {"title": "Post Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PostDetailOut"}}}}}, "tags": ["posts"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/goals": {"get": {"operationId": "core_api_routers_reads_list_goals", "summary": "List goals", "parameters": [{"in": "query", "name": "archived", "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Archived"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedGoalOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/goals/{goal_id}": {"get": {"operationId": "core_api_routers_reads_get_goal_detail", "summary": "A single goal", "parameters": [{"in": "path", "name": "goal_id", "schema": {"title": "Goal Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GoalOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/targets": {"get": {"operationId": "core_api_routers_reads_list_targets", "summary": "List targets", "parameters": [{"in": "query", "name": "time_period_id", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Time Period Id"}, "required": false}, {"in": "query", "name": "goal_id", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Goal Id"}, "required": false}, {"in": "query", "name": "archived", "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Archived"}, "required": false}, {"in": "query", "name": "current", "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Current"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedTargetOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/targets/{target_id}": {"get": {"operationId": "core_api_routers_reads_get_target_detail", "summary": "A single target", "parameters": [{"in": "path", "name": "target_id", "schema": {"title": "Target Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TargetOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/time-periods": {"get": {"operationId": "core_api_routers_reads_list_time_periods", "summary": "List time periods", "parameters": [{"in": "query", "name": "timeframe_type", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Timeframe Type"}, "required": false}, {"in": "query", "name": "current", "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Current"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedTimePeriodOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/time-periods/current": {"get": {"operationId": "core_api_routers_reads_list_current_time_periods", "summary": "Current time periods", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedTimePeriodOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/groups": {"get": {"operationId": "core_api_routers_reads_list_groups", "summary": "List your groups", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedGroupOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}, "/api/v1/groups/{group_uuid}/members": {"get": {"operationId": "core_api_routers_reads_list_group_members", "summary": "Group members", "parameters": [{"in": "path", "name": "group_uuid", "schema": {"title": "Group Uuid", "type": "string"}, "required": true}, {"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedGroupMemberOut"}}}}}, "tags": ["read"], "security": [{"ApiKeyAuth": []}]}}}, "components": {"schemas": {"MeSchema": {"properties": {"id": {"title": "Id", "type": "integer"}, "email": {"title": "Email", "type": "string"}, "display_name": {"title": "Display Name", "type": "string"}}, "required": ["id", "email", "display_name"], "title": "MeSchema", "type": "object"}, "Input": {"properties": {"limit": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}, "offset": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, "title": "Input", "type": "object"}, "MetricOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "goal_id": {"title": "Goal Id", "type": "integer"}, "name": {"title": "Name", "type": "string"}, "kind": {"title": "Kind", "type": "string"}, "value_format": {"title": "Value Format", "type": "string"}, "higher_is_better": {"title": "Higher Is Better", "type": "boolean"}}, "required": ["id", "goal_id", "name", "kind", "value_format", "higher_is_better"], "title": "MetricOut", "type": "object"}, "PagedMetricOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/MetricOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedMetricOut", "type": "object"}, "MetricDetailOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "goal_id": {"title": "Goal Id", "type": "integer"}, "name": {"title": "Name", "type": "string"}, "kind": {"title": "Kind", "type": "string"}, "value_format": {"title": "Value Format", "type": "string"}, "higher_is_better": {"title": "Higher Is Better", "type": "boolean"}, "latest_value": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Latest Value"}, "latest_entry_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "Latest Entry Date"}, "active_target_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Active Target Id"}}, "required": ["id", "goal_id", "name", "kind", "value_format", "higher_is_better", "latest_value", "latest_entry_date", "active_target_id"], "title": "MetricDetailOut", "type": "object"}, "PagedValueOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/ValueOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedValueOut", "type": "object"}, "ValueOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "entry_date": {"format": "date", "title": "Entry Date", "type": "string"}, "value": {"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "title": "Value", "type": "string"}, "notes": {"title": "Notes", "type": "string"}, "source_url": {"title": "Source Url", "type": "string"}}, "required": ["id", "entry_date", "value", "notes", "source_url"], "title": "ValueOut", "type": "object"}, "ValueIn": {"description": "A value to record.\n\n``mode`` decides what happens to the date's existing values. ``append``\nadds one and keeps the rest, which is how a tally accumulates \u2014 three runs\non one Tuesday are three rows. ``replace`` replaces the **whole day**: any\nother values on that date are removed, so the date reads back as exactly\nwhat was sent.", "properties": {"value": {"anyOf": [{"type": "number"}, {"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "type": "string"}], "title": "Value"}, "entry_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "Entry Date"}, "notes": {"default": "", "title": "Notes", "type": "string"}, "mode": {"default": "append", "enum": ["append", "replace"], "title": "Mode", "type": "string"}}, "required": ["value"], "title": "ValueIn", "type": "object"}, "BulkErrorOut": {"properties": {"index": {"title": "Index", "type": "integer"}, "detail": {"title": "Detail", "type": "string"}}, "required": ["index", "detail"], "title": "BulkErrorOut", "type": "object"}, "BulkResultOut": {"properties": {"created": {"title": "Created", "type": "integer"}, "updated": {"title": "Updated", "type": "integer"}, "deleted": {"title": "Deleted", "type": "integer"}, "errors": {"items": {"$ref": "#/components/schemas/BulkErrorOut"}, "title": "Errors", "type": "array"}}, "required": ["created", "updated", "deleted", "errors"], "title": "BulkResultOut", "type": "object"}, "BulkEntryIn": {"properties": {"value": {"anyOf": [{"type": "number"}, {"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "type": "string"}, {"type": "null"}], "title": "Value"}, "entry_date": {"format": "date", "title": "Entry Date", "type": "string"}}, "required": ["entry_date"], "title": "BulkEntryIn", "type": "object"}, "BulkIn": {"properties": {"mode": {"default": "replace", "enum": ["append", "replace"], "title": "Mode", "type": "string"}, "entries": {"items": {"$ref": "#/components/schemas/BulkEntryIn"}, "maxItems": 500, "title": "Entries", "type": "array"}}, "required": ["entries"], "title": "BulkIn", "type": "object"}, "ValuePatch": {"properties": {"value": {"anyOf": [{"type": "number"}, {"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "type": "string"}, {"type": "null"}], "title": "Value"}, "entry_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "Entry Date"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Notes"}}, "title": "ValuePatch", "type": "object"}, "MarkOut": {"properties": {"entry_date": {"format": "date", "title": "Entry Date", "type": "string"}, "done": {"title": "Done", "type": "boolean"}}, "required": ["entry_date", "done"], "title": "MarkOut", "type": "object"}, "MarkIn": {"properties": {"done": {"title": "Done", "type": "boolean"}}, "required": ["done"], "title": "MarkIn", "type": "object"}, "PagedPostOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/PostOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedPostOut", "type": "object"}, "PostAuthorOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "display_name": {"title": "Display Name", "type": "string"}}, "required": ["id", "display_name"], "title": "PostAuthorOut", "type": "object"}, "PostOut": {"description": "``PostFields`` resolved straight off an ``UpdatePost`` instance.\n\nThe three ``*_count`` fields come from annotations the router adds; the\nrest resolve by attribute.", "properties": {"id": {"title": "Id", "type": "integer"}, "group_id": {"title": "Group Id", "type": "string"}, "author": {"$ref": "#/components/schemas/PostAuthorOut"}, "post_type": {"title": "Post Type", "type": "string"}, "published_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Published At"}, "iso_year": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Iso Year"}, "iso_week": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Iso Week"}, "body_markdown": {"title": "Body Markdown", "type": "string"}, "body_html": {"title": "Body Html", "type": "string"}, "tags": {"items": {"type": "string"}, "title": "Tags", "type": "array"}, "like_count": {"title": "Like Count", "type": "integer"}, "comment_count": {"title": "Comment Count", "type": "integer"}, "attachment_count": {"title": "Attachment Count", "type": "integer"}}, "required": ["id", "group_id", "author", "post_type", "published_at", "iso_year", "iso_week", "body_markdown", "body_html", "tags", "like_count", "comment_count", "attachment_count"], "title": "PostOut", "type": "object"}, "PostAttachmentOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "original_filename": {"title": "Original Filename", "type": "string"}, "url": {"title": "Url", "type": "string"}, "thumbnail_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Thumbnail Url"}}, "required": ["id", "original_filename", "url", "thumbnail_url"], "title": "PostAttachmentOut", "type": "object"}, "PostCommentOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "author": {"$ref": "#/components/schemas/PostAuthorOut"}, "body": {"title": "Body", "type": "string"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}}, "required": ["id", "author", "body", "created_at"], "title": "PostCommentOut", "type": "object"}, "PostDetailOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "group_id": {"title": "Group Id", "type": "string"}, "author": {"$ref": "#/components/schemas/PostAuthorOut"}, "post_type": {"title": "Post Type", "type": "string"}, "published_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Published At"}, "iso_year": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Iso Year"}, "iso_week": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Iso Week"}, "body_markdown": {"title": "Body Markdown", "type": "string"}, "body_html": {"title": "Body Html", "type": "string"}, "tags": {"items": {"type": "string"}, "title": "Tags", "type": "array"}, "like_count": {"title": "Like Count", "type": "integer"}, "comment_count": {"title": "Comment Count", "type": "integer"}, "attachment_count": {"title": "Attachment Count", "type": "integer"}, "comments": {"items": {"$ref": "#/components/schemas/PostCommentOut"}, "title": "Comments", "type": "array"}, "attachments": {"items": {"$ref": "#/components/schemas/PostAttachmentOut"}, "title": "Attachments", "type": "array"}, "sections": {"items": {"$ref": "#/components/schemas/PostSectionOut"}, "title": "Sections", "type": "array"}}, "required": ["id", "group_id", "author", "post_type", "published_at", "iso_year", "iso_week", "body_markdown", "body_html", "tags", "like_count", "comment_count", "attachment_count", "comments", "attachments", "sections"], "title": "PostDetailOut", "type": "object"}, "PostSectionItemOut": {"properties": {"target_id": {"title": "Target Id", "type": "integer"}, "metric_id": {"title": "Metric Id", "type": "integer"}, "metric_name": {"title": "Metric Name", "type": "string"}, "description": {"title": "Description", "type": "string"}, "amount": {"anyOf": [{"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "type": "string"}, {"type": "null"}], "title": "Amount"}, "scope": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Scope"}, "value": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Value"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}}, "required": ["target_id", "metric_id", "metric_name", "description", "amount", "scope", "value", "status"], "title": "PostSectionItemOut", "type": "object"}, "PostSectionOut": {"properties": {"time_period": {"$ref": "#/components/schemas/TimePeriodOut"}, "items": {"items": {"$ref": "#/components/schemas/PostSectionItemOut"}, "title": "Items", "type": "array"}}, "required": ["time_period", "items"], "title": "PostSectionOut", "type": "object"}, "TimePeriodOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "timeframe_type": {"title": "Timeframe Type", "type": "string"}, "start_date": {"format": "date", "title": "Start Date", "type": "string"}, "end_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "title": "End Date"}}, "required": ["id", "timeframe_type", "start_date", "end_date"], "title": "TimePeriodOut", "type": "object"}, "GoalOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "title": {"title": "Title", "type": "string"}, "description": {"title": "Description", "type": "string"}, "archived": {"title": "Archived", "type": "boolean"}}, "required": ["id", "title", "description", "archived"], "title": "GoalOut", "type": "object"}, "PagedGoalOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/GoalOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedGoalOut", "type": "object"}, "PagedTargetOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/TargetOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedTargetOut", "type": "object"}, "TargetOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "goal_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Goal Id"}, "metric_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Metric Id"}, "time_period_id": {"title": "Time Period Id", "type": "integer"}, "description": {"title": "Description", "type": "string"}, "amount": {"anyOf": [{"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "type": "string"}, {"type": "null"}], "title": "Amount"}, "scope": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Scope"}, "archived": {"title": "Archived", "type": "boolean"}, "current_value": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Current Value"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}}, "required": ["id", "goal_id", "metric_id", "time_period_id", "description", "amount", "scope", "archived", "current_value", "status"], "title": "TargetOut", "type": "object"}, "PagedTimePeriodOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/TimePeriodOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedTimePeriodOut", "type": "object"}, "GroupOut": {"properties": {"uuid": {"title": "Uuid", "type": "string"}, "name": {"title": "Name", "type": "string"}, "tier": {"title": "Tier", "type": "string"}}, "required": ["uuid", "name", "tier"], "title": "GroupOut", "type": "object"}, "PagedGroupOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/GroupOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedGroupOut", "type": "object"}, "GroupMemberOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "display_name": {"title": "Display Name", "type": "string"}, "is_admin": {"title": "Is Admin", "type": "boolean"}}, "required": ["id", "display_name", "is_admin"], "title": "GroupMemberOut", "type": "object"}, "PagedGroupMemberOut": {"properties": {"items": {"items": {"$ref": "#/components/schemas/GroupMemberOut"}, "title": "Items", "type": "array"}, "count": {"title": "Count", "type": "integer"}}, "required": ["items", "count"], "title": "PagedGroupMemberOut", "type": "object"}}, "securitySchemes": {"ApiKeyAuth": {"type": "http", "scheme": "bearer"}}}, "servers": []}