{
  "openapi": "3.0.3",
  "info": {
    "title": "Empiraa GPS REST API",
    "version": "1.0.0",
    "description": "Read and write your organization's Goals, Objectives, Actions, check-ins, Meetings, Ideas, comments and members. Authenticate with an API key created in Settings > Developer > Keys & Webhooks: send `X-API-Key` and `X-API-Secret`, or `Authorization: Bearer <keyId>:<secret>`. Each key has scopes; each operation lists the scope it needs in `x-required-scope`. Rate limit: 100 requests per minute per key; a 429 response carries `Retry-After`. Operations that fire a webhook name it in `x-webhook-event`."
  },
  "servers": [
    {
      "url": "https://plan.empiraa.app",
      "description": "Production"
    }
  ],
  "security": [
    {
      "apiKeyHeader": [],
      "apiSecretHeader": []
    },
    {
      "bearerApiKey": []
    }
  ],
  "tags": [
    {
      "name": "Info and organization"
    },
    {
      "name": "Goals"
    },
    {
      "name": "Objectives"
    },
    {
      "name": "Check-ins"
    },
    {
      "name": "Actions"
    },
    {
      "name": "Meetings"
    },
    {
      "name": "Ideas"
    },
    {
      "name": "Comments"
    },
    {
      "name": "Members"
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiInfo",
        "summary": "Get API info",
        "tags": [
          "Info and organization"
        ],
        "description": "Returns the API version, the key's organization and scopes, the rate limit and a map of every endpoint. Fields are at the top level, not under `data`.\n\nScope: none (any valid key).",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiInfo"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/organization": {
      "get": {
        "operationId": "getOrganization",
        "summary": "Get the organization",
        "tags": [
          "Info and organization"
        ],
        "description": "Returns the organization's profile.\n\nScope: `organization:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Organization"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "organization:read"
      },
      "patch": {
        "operationId": "updateOrganization",
        "summary": "Update the organization",
        "tags": [
          "Info and organization"
        ],
        "description": "Updates profile fields. Send at least one.\n\nScope: `organization:write`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Organization"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "organization:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrganizationUpdate"
              }
            }
          }
        }
      }
    },
    "/api/v1/goals": {
      "get": {
        "operationId": "listGoals",
        "summary": "List Goals",
        "tags": [
          "Goals"
        ],
        "description": "Returns Goals that aren't archived, by sortOrder then oldest first.\n\nScope: `goals:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Goal"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "goals:read",
        "parameters": [
          {
            "$ref": "#/components/parameters/goalStatus"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createGoal",
        "summary": "Create a Goal",
        "tags": [
          "Goals"
        ],
        "description": "Creates a Goal.\n\nScope: `goals:write`. Webhook: `goal.created`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Goal"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "goals:write",
        "x-webhook-event": "goal.created",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoalCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/goals/{id}": {
      "get": {
        "operationId": "getGoal",
        "summary": "Get a Goal",
        "tags": [
          "Goals"
        ],
        "description": "Returns one Goal. Archived Goals return 404.\n\nScope: `goals:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Goal"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "goals:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateGoal",
        "summary": "Update a Goal",
        "tags": [
          "Goals"
        ],
        "description": "Changes only the fields sent. A body with no recognized fields returns the Goal unchanged and fires no webhook.\n\nScope: `goals:write`. Webhook: `goal.updated`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Goal"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "goals:write",
        "x-webhook-event": "goal.updated",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoalUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteGoal",
        "summary": "Delete a Goal",
        "tags": [
          "Goals"
        ],
        "description": "Permanently deletes the Goal with its Objectives, sub-Objectives, linked Actions, check-ins and comments. Only `goal.deleted` fires.\n\nScope: `goals:write`. Webhook: `goal.deleted`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "goals:write",
        "x-webhook-event": "goal.deleted",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          }
        ]
      }
    },
    "/api/v1/objectives": {
      "get": {
        "operationId": "listObjectives",
        "summary": "List Objectives",
        "tags": [
          "Objectives"
        ],
        "description": "Returns Objectives that aren't archived, by sortOrder then oldest first.\n\nScope: `objectives:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Objective"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:read",
        "parameters": [
          {
            "$ref": "#/components/parameters/goalStatus"
          },
          {
            "name": "goalId",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Only Objectives directly under this Goal."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createObjective",
        "summary": "Create an Objective",
        "tags": [
          "Objectives"
        ],
        "description": "Creates an Objective. It can't have both parentGoalId and parentObjectiveId. Progress isn't calculated from currentValue; record a check-in for that.\n\nScope: `objectives:write`. Webhook: `objective.created`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Objective"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:write",
        "x-webhook-event": "objective.created",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObjectiveCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/goals/{goalId}/objectives": {
      "get": {
        "operationId": "listGoalObjectives",
        "summary": "List a Goal's Objectives",
        "tags": [
          "Objectives"
        ],
        "description": "Returns the Objectives directly under a Goal. This list can include archived Objectives. Order isn't guaranteed.\n\nScope: `objectives:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Objective"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:read",
        "parameters": [
          {
            "name": "goalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          },
          {
            "$ref": "#/components/parameters/goalStatus"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      }
    },
    "/api/v1/objectives/{id}": {
      "get": {
        "operationId": "getObjective",
        "summary": "Get an Objective",
        "tags": [
          "Objectives"
        ],
        "description": "Returns one Objective. Archived Objectives return 404.\n\nScope: `objectives:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Objective"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateObjective",
        "summary": "Update an Objective",
        "tags": [
          "Objectives"
        ],
        "description": "Changes only the fields sent. A body with no recognized fields returns the Objective unchanged and fires no webhook. Changing currentValue doesn't recalculate progress.\n\nScope: `objectives:write`. Webhook: `objective.updated`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Objective"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:write",
        "x-webhook-event": "objective.updated",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObjectiveUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteObjective",
        "summary": "Delete an Objective",
        "tags": [
          "Objectives"
        ],
        "description": "Permanently deletes the Objective with its sub-Objectives, Actions, check-ins and comments. Only `objective.deleted` fires.\n\nScope: `objectives:write`. Webhook: `objective.deleted`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "objectives:write",
        "x-webhook-event": "objective.deleted",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          }
        ]
      }
    },
    "/api/v1/objectives/{objectiveId}/progress": {
      "get": {
        "operationId": "listCheckIns",
        "summary": "List check-ins",
        "tags": [
          "Check-ins"
        ],
        "description": "Returns the Objective's check-in history, newest first.\n\nScope: `progress:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ProgressEntry"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "progress:read",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createCheckIn",
        "summary": "Record a check-in",
        "tags": [
          "Check-ins"
        ],
        "description": "Sets the Objective's currentValue to `value` and recalculates progress: value / targetValue x 100 when a target is set, otherwise `value` is the percentage. Status Objectives record done for 1 or more. Progress must stay within 0-1000% (0-100% for status Objectives). Doesn't change status and fires no webhook.\n\nScope: `progress:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProgressEntry"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "progress:write",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/actions": {
      "get": {
        "operationId": "listActions",
        "summary": "List Actions",
        "tags": [
          "Actions"
        ],
        "description": "Returns Actions linked to a Goal or Objective that isn't archived. Order isn't guaranteed.\n\nScope: `actions:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Action"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:read",
        "parameters": [
          {
            "$ref": "#/components/parameters/actionStatus"
          },
          {
            "name": "objectiveId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "goalId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createAction",
        "summary": "Create an Action",
        "tags": [
          "Actions"
        ],
        "description": "Creates an Action. At least one of objectiveId or goalId is required.\n\nScope: `actions:write`. Webhook: `action.created`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Action"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:write",
        "x-webhook-event": "action.created",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActionCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/objectives/{objectiveId}/actions": {
      "get": {
        "operationId": "listObjectiveActions",
        "summary": "List an Objective's Actions",
        "tags": [
          "Actions"
        ],
        "description": "Returns the Actions whose objectiveId is this Objective.\n\nScope: `actions:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Action"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:read",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          },
          {
            "$ref": "#/components/parameters/actionStatus"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      }
    },
    "/api/v1/goals/{goalId}/actions": {
      "get": {
        "operationId": "listGoalActions",
        "summary": "List a Goal's Actions",
        "tags": [
          "Actions"
        ],
        "description": "Returns the Actions linked directly to the Goal through goalId. Actions linked only to the Goal's Objectives aren't included.\n\nScope: `actions:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Action"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:read",
        "parameters": [
          {
            "name": "goalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          },
          {
            "$ref": "#/components/parameters/actionStatus"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      }
    },
    "/api/v1/actions/{id}": {
      "get": {
        "operationId": "getAction",
        "summary": "Get an Action",
        "tags": [
          "Actions"
        ],
        "description": "Returns one Action.\n\nScope: `actions:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Action"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateAction",
        "summary": "Update an Action",
        "tags": [
          "Actions"
        ],
        "description": "Changes only the fields sent. At least one of objectiveId or goalId must remain set.\n\nScope: `actions:write`. Webhook: `action.updated`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Action"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:write",
        "x-webhook-event": "action.updated",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActionUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteAction",
        "summary": "Delete an Action",
        "tags": [
          "Actions"
        ],
        "description": "Permanently deletes the Action, its comments and reminders.\n\nScope: `actions:write`. Webhook: `action.deleted`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "actions:write",
        "x-webhook-event": "action.deleted",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          }
        ]
      }
    },
    "/api/v1/meetings": {
      "get": {
        "operationId": "listMeetings",
        "summary": "List Meetings",
        "tags": [
          "Meetings"
        ],
        "description": "Returns Meetings that aren't archived. Order isn't guaranteed.\n\nScope: `meetings:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Meeting"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "meetings:read",
        "parameters": [
          {
            "$ref": "#/components/parameters/meetingStatus"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createMeeting",
        "summary": "Create a Meeting",
        "tags": [
          "Meetings"
        ],
        "description": "Creates a Meeting.\n\nScope: `meetings:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Meeting"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "meetings:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/meetings/{id}": {
      "get": {
        "operationId": "getMeeting",
        "summary": "Get a Meeting",
        "tags": [
          "Meetings"
        ],
        "description": "Returns one Meeting.\n\nScope: `meetings:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Meeting"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "meetings:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateMeeting",
        "summary": "Update a Meeting",
        "tags": [
          "Meetings"
        ],
        "description": "Changes only the fields sent.\n\nScope: `meetings:write`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Meeting"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "meetings:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteMeeting",
        "summary": "Delete a Meeting",
        "tags": [
          "Meetings"
        ],
        "description": "Permanently deletes the Meeting.\n\nScope: `meetings:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "meetings:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          }
        ]
      }
    },
    "/api/v1/ideas": {
      "get": {
        "operationId": "listIdeas",
        "summary": "List Ideas",
        "tags": [
          "Ideas"
        ],
        "description": "Returns visible Ideas, by stage and board order.\n\nScope: `ideas:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Idea"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "ideas:read",
        "parameters": [
          {
            "$ref": "#/components/parameters/ideaStage"
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createIdea",
        "summary": "Create an Idea",
        "tags": [
          "Ideas"
        ],
        "description": "Creates an Idea.\n\nScope: `ideas:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Idea"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "ideas:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IdeaCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/ideas/{id}": {
      "get": {
        "operationId": "getIdea",
        "summary": "Get an Idea",
        "tags": [
          "Ideas"
        ],
        "description": "Returns one Idea. Hidden Ideas return 404.\n\nScope: `ideas:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Idea"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "ideas:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Idea ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateIdea",
        "summary": "Update an Idea",
        "tags": [
          "Ideas"
        ],
        "description": "Changes only the fields sent. Send columnKey to change stage.\n\nScope: `ideas:write`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Idea"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "ideas:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Idea ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IdeaUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteIdea",
        "summary": "Delete an Idea",
        "tags": [
          "Ideas"
        ],
        "description": "Permanently deletes the Idea.\n\nScope: `ideas:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "ideas:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Idea ID."
          }
        ]
      }
    },
    "/api/v1/goals/{goalId}/comments": {
      "get": {
        "operationId": "listGoalComments",
        "summary": "List comments on a Goal",
        "tags": [
          "Comments"
        ],
        "description": "Returns the Goal's comments. Order isn't guaranteed.\n\nScope: `comments:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Comment"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:read",
        "parameters": [
          {
            "name": "goalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createGoalComment",
        "summary": "Add a comment to a Goal",
        "tags": [
          "Comments"
        ],
        "description": "Adds a comment to the Goal.\n\nScope: `comments:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comment"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "goalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/goals/{goalId}/comments/{commentId}": {
      "delete": {
        "operationId": "deleteGoalComment",
        "summary": "Delete a comment on a Goal",
        "tags": [
          "Comments"
        ],
        "description": "Permanently deletes a comment on the Goal. The comment must belong to that Goal.\n\nScope: `comments:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "goalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Goal ID."
          },
          {
            "name": "commentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comment ID."
          }
        ]
      }
    },
    "/api/v1/objectives/{objectiveId}/comments": {
      "get": {
        "operationId": "listObjectiveComments",
        "summary": "List comments on a Objective",
        "tags": [
          "Comments"
        ],
        "description": "Returns the Objective's comments. Order isn't guaranteed.\n\nScope: `comments:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Comment"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:read",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createObjectiveComment",
        "summary": "Add a comment to a Objective",
        "tags": [
          "Comments"
        ],
        "description": "Adds a comment to the Objective.\n\nScope: `comments:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comment"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/objectives/{objectiveId}/comments/{commentId}": {
      "delete": {
        "operationId": "deleteObjectiveComment",
        "summary": "Delete a comment on a Objective",
        "tags": [
          "Comments"
        ],
        "description": "Permanently deletes a comment on the Objective. The comment must belong to that Objective.\n\nScope: `comments:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "objectiveId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Objective ID."
          },
          {
            "name": "commentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comment ID."
          }
        ]
      }
    },
    "/api/v1/meetings/{meetingId}/comments": {
      "get": {
        "operationId": "listMeetingComments",
        "summary": "List comments on a Meeting",
        "tags": [
          "Comments"
        ],
        "description": "Returns the Meeting's comments. Order isn't guaranteed.\n\nScope: `comments:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Comment"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:read",
        "parameters": [
          {
            "name": "meetingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createMeetingComment",
        "summary": "Add a comment to a Meeting",
        "tags": [
          "Comments"
        ],
        "description": "Adds a comment to the Meeting.\n\nScope: `comments:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comment"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "meetingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/meetings/{meetingId}/comments/{commentId}": {
      "delete": {
        "operationId": "deleteMeetingComment",
        "summary": "Delete a comment on a Meeting",
        "tags": [
          "Comments"
        ],
        "description": "Permanently deletes a comment on the Meeting. The comment must belong to that Meeting.\n\nScope: `comments:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "meetingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Meeting ID."
          },
          {
            "name": "commentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comment ID."
          }
        ]
      }
    },
    "/api/v1/actions/{actionId}/comments": {
      "get": {
        "operationId": "listActionComments",
        "summary": "List comments on a Action",
        "tags": [
          "Comments"
        ],
        "description": "Returns the Action's comments. Order isn't guaranteed.\n\nScope: `comments:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Comment"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:read",
        "parameters": [
          {
            "name": "actionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createActionComment",
        "summary": "Add a comment to a Action",
        "tags": [
          "Comments"
        ],
        "description": "Adds a comment to the Action.\n\nScope: `comments:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comment"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "actionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/actions/{actionId}/comments/{commentId}": {
      "delete": {
        "operationId": "deleteActionComment",
        "summary": "Delete a comment on a Action",
        "tags": [
          "Comments"
        ],
        "description": "Permanently deletes a comment on the Action. The comment must belong to that Action.\n\nScope: `comments:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "actionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Action ID."
          },
          {
            "name": "commentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comment ID."
          }
        ]
      }
    },
    "/api/v1/ideas/{ideaId}/comments": {
      "get": {
        "operationId": "listIdeaComments",
        "summary": "List comments on a Idea",
        "tags": [
          "Comments"
        ],
        "description": "Returns the Idea's comments. Oldest first.\n\nScope: `comments:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Comment"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:read",
        "parameters": [
          {
            "name": "ideaId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Idea ID."
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createIdeaComment",
        "summary": "Add a comment to a Idea",
        "tags": [
          "Comments"
        ],
        "description": "Adds a comment to the Idea. The text goes in `body`.\n\nScope: `comments:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comment"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "ideaId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Idea ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IdeaCommentCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/comments/{id}": {
      "delete": {
        "operationId": "deleteCommentById",
        "summary": "Delete a comment by ID",
        "tags": [
          "Comments"
        ],
        "description": "Permanently deletes a comment, given the kind of parent it's on. The only way to delete a comment on an Idea.\n\nScope: `comments:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "description": "`type` is missing or not allowed (VALIDATION_ERROR).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "comments:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comment ID."
          },
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "goal",
                "objective",
                "meeting",
                "action",
                "idea"
              ]
            }
          }
        ]
      }
    },
    "/api/v1/users": {
      "get": {
        "operationId": "listMembers",
        "summary": "List members",
        "tags": [
          "Members"
        ],
        "description": "Returns active members by default.\n\nScope: `users:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Member"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadFilter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "users:read",
        "parameters": [
          {
            "name": "includePending",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true also returns people whose invitation hasn't been accepted."
          },
          {
            "name": "includeInactive",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true also returns deactivated members."
          },
          {
            "name": "role",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "Owner",
                "Super Admin",
                "Admin",
                "Team Leader",
                "Team Member",
                "Viewer"
              ]
            }
          },
          {
            "name": "inviteStatus",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "invited",
                "accepted",
                "added",
                "declined",
                "revoked"
              ]
            }
          },
          {
            "name": "isActive",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/offset"
          }
        ]
      },
      "post": {
        "operationId": "createMember",
        "summary": "Invite or add a member",
        "tags": [
          "Members"
        ],
        "description": "Invites a person by email, or adds them directly with skipEmail. Owner and Super Admin can't be assigned.\n\nScope: `users:write`.",
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Member"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/MemberCreateMeta"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "description": "Validation failed, the invitation was refused, or no inviter was found (VALIDATION_ERROR, NO_INVITER).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationError"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "users:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberCreate"
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{id}": {
      "get": {
        "operationId": "getMember",
        "summary": "Get a member",
        "tags": [
          "Members"
        ],
        "description": "Returns any member, including pending and deactivated ones.\n\nScope: `users:read`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Member"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "users:read",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Member ID."
          }
        ]
      },
      "patch": {
        "operationId": "updateMember",
        "summary": "Update a member",
        "tags": [
          "Members"
        ],
        "description": "Changes role, position, name or isActive. The person who created the organization's account can't be deactivated or have their role changed.\n\nScope: `users:write`.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Member"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "users:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Member ID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteMember",
        "summary": "Remove a member",
        "tags": [
          "Members"
        ],
        "description": "Removes the member. Refused while records still point to them.\n\nScope: `users:write`.",
        "responses": {
          "204": {
            "$ref": "#/components/responses/NoContent"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "Records still point to the member (MEMBER_IN_USE).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberInUseError"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "x-required-scope": "users:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Member ID."
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "apiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "The API key ID (starts with `emp_`). Send with X-API-Secret."
      },
      "apiSecretHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Secret",
        "description": "The API key secret. Send with X-API-Key."
      },
      "bearerApiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "keyId:secret",
        "description": "Authorization: Bearer <keyId>:<secret>"
      }
    },
    "parameters": {
      "limit": {
        "name": "limit",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        },
        "description": "Records per page."
      },
      "offset": {
        "name": "offset",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        },
        "description": "Records to skip."
      },
      "goalStatus": {
        "name": "status",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "not_started",
            "started",
            "on_track",
            "off_track",
            "completed",
            "active",
            "at_risk",
            "missed"
          ]
        },
        "description": "Progress status. `at_risk` and `missed` mean `off_track`; `active` applies no filter; `archived` returns 400."
      },
      "actionStatus": {
        "name": "status",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "to_do",
            "started",
            "on_track",
            "off_track",
            "completed",
            "cancelled",
            "archived",
            "To Do"
          ]
        },
        "description": "Action status. `To Do` means `to_do`."
      },
      "meetingStatus": {
        "name": "status",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "scheduled",
            "in_progress",
            "paused",
            "completed",
            "cancelled",
            "resolved_async"
          ]
        }
      },
      "ideaStage": {
        "name": "stage",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "ideas",
            "review",
            "in_progress",
            "implemented"
          ]
        }
      }
    },
    "responses": {
      "BadFilter": {
        "description": "A filter value isn't allowed (INVALID_STATUS_QUERY).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, invalid, revoked or expired credentials (MISSING_CREDENTIALS, MISSING_SECRET, INVALID_CREDENTIALS, KEY_INACTIVE, KEY_EXPIRED).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The key lacks the scope (INSUFFICIENT_SCOPE), or the request named another organization (ORG_MISMATCH).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "Not found, in another organization, archived or hidden (NOT_FOUND).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unprocessable": {
        "description": "Validation failed (VALIDATION_ERROR, INVALID_REFERENCE, INVALID_USERS, NO_KEY_OWNER).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ValidationError"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limit exceeded (RATE_LIMIT_EXCEEDED).",
        "headers": {
          "Retry-After": {
            "description": "Seconds until the window resets.",
            "schema": {
              "type": "integer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/RateLimitError"
            }
          }
        }
      },
      "ServerError": {
        "description": "Unexpected error (INTERNAL_ERROR).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NoContent": {
        "description": "Deleted. No body."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "docs": {
            "type": "string",
            "description": "Link to the API documentation."
          }
        },
        "required": [
          "error",
          "code"
        ]
      },
      "ValidationError": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Error"
          },
          {
            "type": "object",
            "properties": {
              "issues": {
                "type": "array",
                "description": "Present when the body failed schema validation. One entry per failing field.",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "path": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "integer"
                          }
                        ]
                      }
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              },
              "invalidIds": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Present with INVALID_USERS: the member IDs that aren't active members."
              }
            }
          }
        ]
      },
      "RateLimitError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "enum": [
              "RATE_LIMIT_EXCEEDED"
            ]
          },
          "retryAfterSeconds": {
            "type": "integer"
          }
        },
        "required": [
          "error",
          "code"
        ]
      },
      "MemberInUseError": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Error"
          },
          {
            "type": "object",
            "properties": {
              "blockers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string",
                      "enum": [
                        "ASSIGNED_GOALS",
                        "ASSIGNED_OBJECTIVES",
                        "ASSIGNED_ACTIONS",
                        "CIP_IDEA_ASSIGNEE",
                        "ORG_CHART_NODE",
                        "CIP_BOARD_MEMBER",
                        "FK_VIOLATION"
                      ]
                    },
                    "message": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "PaginationMeta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Matching records before paging."
          },
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          }
        },
        "required": [
          "total",
          "limit",
          "offset"
        ]
      },
      "ApiInfo": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "enum": [
              "v1"
            ]
          },
          "organization": {
            "type": "string",
            "description": "The key's organization ID."
          },
          "subAccountId": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "type": "string",
            "description": "Keys created in Settings are `scoped`."
          },
          "keyName": {
            "type": "string"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rateLimit": {
            "type": "object",
            "properties": {
              "requestsPerMinute": {
                "type": "integer"
              }
            }
          },
          "endpoints": {
            "type": "object",
            "additionalProperties": true
          },
          "documentation": {
            "type": "string"
          }
        }
      },
      "Organization": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "vision": {
            "type": "string",
            "nullable": true
          },
          "industry": {
            "type": "string",
            "nullable": true
          },
          "website": {
            "type": "string",
            "nullable": true
          },
          "plan": {
            "type": "string",
            "nullable": true,
            "description": "Name of the organization's GPS plan. Not returned by PATCH."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "OrganizationUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "vision": {
            "type": "string",
            "maxLength": 5000,
            "nullable": true
          },
          "industry": {
            "type": "string",
            "maxLength": 200,
            "nullable": true
          },
          "website": {
            "type": "string",
            "format": "uri",
            "maxLength": 500,
            "nullable": true
          }
        },
        "description": "Send at least one field."
      },
      "Goal": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "enum": [
              "KPI",
              "OKR",
              "ROCK"
            ]
          },
          "progress": {
            "type": "string",
            "description": "Progress percentage as a decimal string."
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed",
              null
            ],
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "archived": {
            "type": "boolean"
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "sortOrder": {
            "type": "integer"
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "organizationId": {
            "type": "string"
          },
          "sourceMeetingId": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "GoalCreate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed"
            ]
          },
          "progress": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1000
              },
              {
                "type": "string"
              }
            ],
            "description": "Progress percentage, 0 to 1000. Stored and returned as a decimal string."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "On or after startDate.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs."
          },
          "type": {
            "type": "string",
            "enum": [
              "KPI",
              "OKR",
              "ROCK"
            ],
            "description": "Default OKR."
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "title"
        ]
      },
      "GoalUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed"
            ]
          },
          "progress": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1000
              },
              {
                "type": "string"
              }
            ],
            "description": "Progress percentage, 0 to 1000. Stored and returned as a decimal string."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "On or after startDate.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs."
          }
        },
        "description": "Send only the fields to change. `type` and `onBehalfOf` are ignored."
      },
      "Objective": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "enum": [
              "KPI",
              "OKR",
              "ROCK"
            ]
          },
          "measurementType": {
            "type": "string",
            "description": "`$`, `%`, `Number`, `Status (On Track / Off Track / Complete)`, or a custom measurement type name."
          },
          "aggregationType": {
            "type": "string",
            "nullable": true
          },
          "progress": {
            "type": "string",
            "description": "Progress percentage as a decimal string."
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed",
              null
            ],
            "nullable": true,
            "description": "null means GPS works the status out from progress and dates."
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "targetValue": {
            "type": "number",
            "nullable": true
          },
          "currentValue": {
            "type": "number",
            "nullable": true
          },
          "unit": {
            "type": "string",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "parentGoalId": {
            "type": "string",
            "nullable": true
          },
          "parentObjectiveId": {
            "type": "string",
            "nullable": true
          },
          "checkinFrequency": {
            "type": "string",
            "enum": [
              "weekly",
              "monthly",
              "quarterly",
              null
            ],
            "nullable": true
          },
          "checkinDay": {
            "type": "integer",
            "nullable": true
          },
          "trackingPeriod": {
            "type": "string",
            "enum": [
              "total",
              "weekly",
              "monthly",
              "yearly"
            ]
          },
          "lastResetDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastPeriodProgress": {
            "type": "string",
            "nullable": true
          },
          "archived": {
            "type": "boolean"
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "headerImageUrl": {
            "type": "string",
            "nullable": true
          },
          "headerColor": {
            "type": "string",
            "nullable": true
          },
          "calculationMode": {
            "type": "string",
            "enum": [
              "manual",
              "auto"
            ]
          },
          "isRollupLocked": {
            "type": "boolean"
          },
          "aggregatedProgress": {
            "type": "string",
            "nullable": true
          },
          "integrationFormula": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true
          },
          "lastIntegrationSync": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "integrationSyncStatus": {
            "type": "string",
            "nullable": true
          },
          "autoSyncEnabled": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "integer"
          },
          "weight": {
            "type": "string",
            "nullable": true,
            "description": "Share of the Goal's progress, 0 to 100; null means an equal share."
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "organizationId": {
            "type": "string"
          },
          "sourceMeetingId": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ObjectiveCreate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "parentGoalId": {
            "type": "string",
            "nullable": true,
            "description": "A Goal in your organization. Not with parentObjectiveId."
          },
          "parentObjectiveId": {
            "type": "string",
            "nullable": true,
            "description": "An Objective in your organization. Not with parentGoalId."
          },
          "type": {
            "type": "string",
            "enum": [
              "KPI",
              "OKR",
              "ROCK"
            ],
            "description": "Default OKR."
          },
          "measurementType": {
            "type": "string",
            "minLength": 1,
            "description": "Default `Number`. Common words such as currency, percent, count and status are converted to the built-in types."
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed"
            ]
          },
          "progress": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1000
              },
              {
                "type": "string"
              }
            ],
            "description": "Progress percentage, 0 to 1000. Stored and returned as a decimal string."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "targetValue": {
            "type": "number",
            "exclusiveMinimum": true,
            "minimum": 0,
            "nullable": true
          },
          "currentValue": {
            "oneOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "nullable": true,
            "description": "A string has $ , % and spaces removed before it's read as a number."
          },
          "unit": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "On or after startDate.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs."
          },
          "checkinFrequency": {
            "type": "string",
            "enum": [
              "weekly",
              "monthly",
              "quarterly",
              null
            ],
            "nullable": true
          },
          "checkinDay": {
            "type": "integer",
            "minimum": 1,
            "maximum": 31,
            "nullable": true
          },
          "trackingPeriod": {
            "type": "string",
            "enum": [
              "total",
              "weekly",
              "monthly",
              "yearly"
            ]
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "title"
        ]
      },
      "ObjectiveUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "parentGoalId": {
            "type": "string",
            "nullable": true,
            "description": "A Goal in your organization. Not with parentObjectiveId."
          },
          "parentObjectiveId": {
            "type": "string",
            "nullable": true,
            "description": "An Objective in your organization. Not with parentGoalId."
          },
          "type": {
            "type": "string",
            "enum": [
              "KPI",
              "OKR",
              "ROCK"
            ]
          },
          "measurementType": {
            "type": "string",
            "minLength": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "not_started",
              "started",
              "on_track",
              "off_track",
              "completed"
            ]
          },
          "progress": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1000
              },
              {
                "type": "string"
              }
            ],
            "description": "Progress percentage, 0 to 1000. Stored and returned as a decimal string."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "targetValue": {
            "type": "number",
            "exclusiveMinimum": true,
            "minimum": 0,
            "nullable": true
          },
          "currentValue": {
            "oneOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "nullable": true,
            "description": "A string has $ , % and spaces removed before it's read as a number."
          },
          "unit": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "On or after startDate.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "assignedTo": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "isPrivate": {
            "type": "boolean"
          },
          "invitedUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs."
          },
          "checkinFrequency": {
            "type": "string",
            "enum": [
              "weekly",
              "monthly",
              "quarterly",
              null
            ],
            "nullable": true
          },
          "checkinDay": {
            "type": "integer",
            "minimum": 1,
            "maximum": 31,
            "nullable": true
          },
          "trackingPeriod": {
            "type": "string",
            "enum": [
              "total",
              "weekly",
              "monthly",
              "yearly"
            ]
          }
        },
        "description": "Send only the fields to change. `onBehalfOf` is ignored."
      },
      "ProgressEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "objectiveId": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "updatedBy": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "number",
            "nullable": true
          },
          "previousProgress": {
            "type": "number",
            "nullable": true
          },
          "newProgress": {
            "type": "number",
            "nullable": true
          },
          "progressChange": {
            "type": "number",
            "nullable": true
          },
          "previousValue": {
            "type": "number",
            "nullable": true
          },
          "newValue": {
            "type": "number",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ProgressCreate": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "description": "The Objective's new value."
          },
          "notes": {
            "type": "string",
            "maxLength": 2000,
            "nullable": true
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "value"
        ]
      },
      "Action": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "objectiveId": {
            "type": "string",
            "nullable": true
          },
          "goalId": {
            "type": "string",
            "nullable": true
          },
          "assignees": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "One of to_do, started, on_track, off_track, completed, cancelled, archived. Some older Actions store `To Do`."
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reminderDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reminderFrequency": {
            "type": "string",
            "enum": [
              "daily",
              "weekly",
              "monthly",
              null
            ],
            "nullable": true
          },
          "reminderSent": {
            "type": "boolean"
          },
          "emailReminder": {
            "type": "boolean"
          },
          "appReminder": {
            "type": "boolean"
          },
          "isRepeatable": {
            "type": "boolean"
          },
          "repeatFrequency": {
            "type": "string",
            "enum": [
              "weekly",
              "monthly",
              null
            ],
            "nullable": true
          },
          "repeatDay": {
            "type": "integer",
            "nullable": true
          },
          "isPrivate": {
            "type": "boolean"
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "sourceMeetingId": {
            "type": "string",
            "nullable": true
          },
          "portalOriginMasterUserId": {
            "type": "string",
            "nullable": true
          },
          "positionInSet": {
            "type": "integer",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ActionCreate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "objectiveId": {
            "type": "string",
            "nullable": true,
            "description": "An Objective in your organization."
          },
          "goalId": {
            "type": "string",
            "nullable": true,
            "description": "A Goal in your organization."
          },
          "status": {
            "type": "string",
            "enum": [
              "to_do",
              "started",
              "on_track",
              "off_track",
              "completed",
              "cancelled",
              "archived",
              "To Do"
            ],
            "description": "Default `started`. `To Do` is accepted as `to_do`."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true,
            "description": "Default `Medium`."
          },
          "assignees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "isPrivate": {
            "type": "boolean"
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "title"
        ],
        "description": "At least one of objectiveId or goalId is required."
      },
      "ActionUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "objectiveId": {
            "type": "string",
            "nullable": true,
            "description": "An Objective in your organization."
          },
          "goalId": {
            "type": "string",
            "nullable": true,
            "description": "A Goal in your organization."
          },
          "status": {
            "type": "string",
            "enum": [
              "to_do",
              "started",
              "on_track",
              "off_track",
              "completed",
              "cancelled",
              "archived",
              "To Do"
            ],
            "description": "`To Do` is accepted as `to_do`."
          },
          "priority": {
            "type": "string",
            "enum": [
              "High",
              "Medium",
              "Low",
              null
            ],
            "nullable": true
          },
          "assignees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Active member IDs."
          },
          "startDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "completedDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "isPrivate": {
            "type": "boolean"
          }
        },
        "description": "Send at least one field. At least one of objectiveId or goalId must remain set. `onBehalfOf` is ignored."
      },
      "Meeting": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "in_progress",
              "paused",
              "completed",
              "cancelled",
              "resolved_async",
              null
            ],
            "nullable": true
          },
          "meetingType": {
            "type": "string",
            "nullable": true
          },
          "scheduledDate": {
            "type": "string",
            "format": "date-time"
          },
          "duration": {
            "type": "integer",
            "nullable": true
          },
          "actualStartTime": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "actualEndTime": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "actualDuration": {
            "type": "integer",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "isVirtual": {
            "type": "boolean",
            "nullable": true
          },
          "meetingUrl": {
            "type": "string",
            "nullable": true
          },
          "attendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs."
          },
          "externalAttendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Email addresses."
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "meetingSummary": {
            "type": "string",
            "nullable": true
          },
          "keyDecisions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The text of each decision."
          },
          "participantCount": {
            "type": "integer"
          },
          "recordingUrl": {
            "type": "string",
            "nullable": true
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "organizationId": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "MeetingCreate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "scheduledDate": {
            "type": "string",
            "format": "date-time",
            "description": "Scheduled start."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Minutes. Default 60."
          },
          "attendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Member IDs. Not checked against the member list."
          },
          "externalAttendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Email addresses."
          },
          "meetingType": {
            "type": "string",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "isVirtual": {
            "type": "boolean",
            "nullable": true,
            "description": "Default true."
          },
          "meetingUrl": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "in_progress",
              "paused",
              "completed",
              "cancelled",
              "resolved_async"
            ],
            "description": "Default `scheduled`."
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "title",
          "scheduledDate"
        ]
      },
      "MeetingUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "scheduledDate": {
            "type": "string",
            "format": "date-time",
            "description": "Scheduled start."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Minutes. Default 60."
          },
          "attendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Member IDs. Not checked against the member list."
          },
          "externalAttendees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Email addresses."
          },
          "meetingType": {
            "type": "string",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "isVirtual": {
            "type": "boolean",
            "nullable": true,
            "description": "Default true."
          },
          "meetingUrl": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "in_progress",
              "paused",
              "completed",
              "cancelled",
              "resolved_async"
            ],
            "description": "Default `scheduled`."
          },
          "notes": {
            "type": "string",
            "nullable": true
          }
        },
        "description": "Send at least one field. `onBehalfOf` is ignored."
      },
      "Idea": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "stage": {
            "type": "string",
            "enum": [
              "ideas",
              "review",
              "in_progress",
              "implemented"
            ]
          },
          "tag": {
            "type": "string",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "boardId": {
            "type": "string",
            "nullable": true
          },
          "linkedGoalId": {
            "type": "string",
            "nullable": true
          },
          "linkedObjectiveId": {
            "type": "string",
            "nullable": true
          },
          "linkedActionId": {
            "type": "string",
            "nullable": true
          },
          "assignees": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Member IDs. Read-only."
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "organizationId": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "IdeaCreate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "maxLength": 5000,
            "nullable": true
          },
          "columnKey": {
            "type": "string",
            "enum": [
              "ideas",
              "review",
              "in_progress",
              "implemented"
            ],
            "description": "The stage. Default `ideas`. Returned as `stage`."
          },
          "tag": {
            "type": "string",
            "maxLength": 40,
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "boardId": {
            "type": "string",
            "nullable": true
          },
          "linkedGoalId": {
            "type": "string",
            "nullable": true
          },
          "linkedObjectiveId": {
            "type": "string",
            "nullable": true
          },
          "linkedActionId": {
            "type": "string",
            "nullable": true
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "title"
        ]
      },
      "IdeaUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "maxLength": 5000,
            "nullable": true
          },
          "columnKey": {
            "type": "string",
            "enum": [
              "ideas",
              "review",
              "in_progress",
              "implemented"
            ],
            "description": "The stage. Returned as `stage`."
          },
          "tag": {
            "type": "string",
            "maxLength": 40,
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "description": "ISO 8601 date or date-time. A date alone means midnight UTC.",
            "nullable": true
          },
          "boardId": {
            "type": "string",
            "nullable": true
          },
          "linkedGoalId": {
            "type": "string",
            "nullable": true
          },
          "linkedObjectiveId": {
            "type": "string",
            "nullable": true
          },
          "linkedActionId": {
            "type": "string",
            "nullable": true
          }
        },
        "description": "Send only the fields to change. `onBehalfOf` is ignored."
      },
      "Comment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "content": {
            "type": "string"
          },
          "authorId": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CommentCreate": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "content"
        ]
      },
      "IdeaCommentCreate": {
        "type": "object",
        "properties": {
          "body": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "onBehalfOf": {
            "type": "string",
            "description": "Member ID of an active member to attribute this record to. Defaults to the member who created the API key."
          }
        },
        "required": [
          "body"
        ]
      },
      "Member": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Member ID."
          },
          "organizationId": {
            "type": "string"
          },
          "userId": {
            "type": "string",
            "description": "GPS account ID."
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "Owner",
              "Super Admin",
              "Admin",
              "Team Leader",
              "Team Member",
              "Viewer"
            ]
          },
          "position": {
            "type": "string",
            "nullable": true
          },
          "inviteStatus": {
            "type": "string",
            "enum": [
              "pending",
              "invited",
              "accepted",
              "added",
              "declined",
              "revoked",
              null
            ],
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "joinedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "MemberCreate": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "role": {
            "type": "string",
            "enum": [
              "Viewer",
              "Team Member",
              "Team Leader",
              "Admin"
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "skipEmail": {
            "type": "boolean",
            "default": false,
            "description": "true adds the person directly without an invitation email."
          }
        },
        "required": [
          "email",
          "role"
        ]
      },
      "MemberCreateMeta": {
        "type": "object",
        "properties": {
          "delivery": {
            "type": "string",
            "enum": [
              "invitation",
              "direct_add"
            ]
          },
          "invitationExpiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "emailSent": {
            "type": "boolean"
          }
        }
      },
      "MemberUpdate": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "Viewer",
              "Team Member",
              "Team Leader",
              "Admin"
            ]
          },
          "position": {
            "type": "string",
            "maxLength": 200,
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "description": "Send at least one field."
      }
    }
  }
}
