{
  "openapi": "3.1.0",
  "info": {
    "title": "Mite API",
    "version": "1.0.0",
    "summary": "In-app feedback, feature requests, and release notes for Expo and React Native apps.",
    "description": "The Mite REST API. Mobile apps call it through the Mite SDK (`@usemite/mite-sdk`); you can also call it directly with any HTTP client. Every endpoint except `/api/v1/health` needs a Mite API key, created in the Mite dashboard under an application’s Settings → Keys.\n\nMite API keys are publishable, SDK-style tokens: they ship inside mobile binaries and are not secrets. Abuse is handled with per-key rate limits and revocation, not with secrecy.",
    "termsOfService": "https://usemite.com/terms",
    "contact": {
      "name": "Mite",
      "url": "https://usemite.com/docs"
    },
    "license": {
      "name": "Proprietary",
      "identifier": "LicenseRef-Proprietary"
    }
  },
  "externalDocs": {
    "description": "Mite developer docs",
    "url": "https://usemite.com/docs"
  },
  "servers": [
    {
      "url": "https://intent-okapi-412.convex.site",
      "description": "Mite API"
    }
  ],
  "security": [
    {
      "apiKey": []
    }
  ],
  "tags": [
    {
      "name": "Bug reports",
      "description": "Submit reports from inside an app."
    },
    {
      "name": "Feature requests",
      "description": "Collect and rank requests."
    },
    {
      "name": "Releases",
      "description": "Read published release notes."
    },
    {
      "name": "Announcements",
      "description": "Read in-app announcements."
    },
    {
      "name": "End users",
      "description": "Attach an identity to reports."
    },
    {
      "name": "Service",
      "description": "Health and static assets."
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Send `Authorization: Bearer mite_ak_...`. Keys carry `read` and/or `write` scopes; each endpoint states which it needs."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable failure reason."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable code. Branch on this, not on the message.",
            "examples": [
              "unauthorized",
              "invalid_request",
              "rate_limited"
            ]
          },
          "hint": {
            "type": "string",
            "description": "How to resolve the failure."
          }
        }
      },
      "QuotaError": {
        "type": "object",
        "required": [
          "error",
          "code",
          "quota"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "enum": [
              "REPORT_QUOTA_EXCEEDED",
              "STORAGE_QUOTA_EXCEEDED"
            ]
          },
          "hint": {
            "type": "string"
          },
          "quota": {
            "type": "object",
            "required": [
              "limit",
              "used"
            ],
            "properties": {
              "limit": {
                "type": "integer"
              },
              "used": {
                "type": "integer"
              },
              "resets_at": {
                "type": "integer",
                "description": "Unix epoch milliseconds."
              }
            }
          }
        }
      },
      "Release": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "versionCode": {
            "type": "string"
          },
          "platform": {
            "type": "string",
            "enum": [
              "ios",
              "android",
              "all"
            ]
          },
          "notes": {
            "type": "string",
            "description": "Release notes as Markdown."
          },
          "easUpdateId": {
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "runtimeVersion": {
            "type": "string"
          },
          "releasedAt": {
            "type": "integer"
          },
          "createdAt": {
            "type": "integer"
          }
        }
      },
      "Announcement": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "content": {
            "type": "string",
            "description": "Announcement body as Markdown."
          },
          "platform": {
            "type": "string",
            "enum": [
              "ios",
              "android",
              "all"
            ]
          },
          "ctaLabel": {
            "type": "string"
          },
          "ctaUrl": {
            "type": "string"
          },
          "publishedAt": {
            "type": "integer"
          },
          "updatedAt": {
            "type": "integer"
          },
          "createdAt": {
            "type": "integer"
          }
        }
      },
      "FeatureRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "authorName": {
            "type": "string"
          },
          "voteCount": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "OPEN",
              "IN_PROGRESS",
              "COMPLETED",
              "CLOSED"
            ]
          },
          "createdAt": {
            "type": "integer"
          }
        }
      }
    }
  },
  "paths": {
    "/api/v1/health": {
      "get": {
        "tags": [
          "Service"
        ],
        "operationId": "getHealth",
        "summary": "Service health",
        "description": "Liveness probe. The only endpoint that needs no key.",
        "security": [],
        "responses": {
          "200": {
            "description": "The service is reachable.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "timestamp"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok"
                      ]
                    },
                    "timestamp": {
                      "type": "integer",
                      "description": "Unix epoch milliseconds."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/bug-reports": {
      "post": {
        "tags": [
          "Bug reports"
        ],
        "operationId": "createBugReport",
        "summary": "Submit a bug report",
        "description": "Requires the `write` scope. Accepted reports enter triage. Bodies over 256 KB are rejected with 413.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "description"
                ],
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 10000
                  },
                  "steps_to_reproduce": {
                    "type": "string"
                  },
                  "expected_behavior": {
                    "type": "string"
                  },
                  "actual_behavior": {
                    "type": "string"
                  },
                  "user_identifier": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "anonymous_id": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "reporter_email": {
                    "type": "string",
                    "format": "email"
                  },
                  "reporter_name": {
                    "type": "string"
                  },
                  "app_version": {
                    "type": "string"
                  },
                  "eas_update_id": {
                    "type": "string"
                  },
                  "channel": {
                    "type": "string"
                  },
                  "runtime_version": {
                    "type": "string"
                  },
                  "device_info": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Flat map of string values. At most 50 keys."
                  },
                  "environment": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Flat map of string values. At most 50 keys."
                  },
                  "navigation_trail": {
                    "type": "array",
                    "maxItems": 50,
                    "description": "Screens the reporter visited, oldest first.",
                    "items": {
                      "type": "object",
                      "required": [
                        "screen",
                        "timestamp"
                      ],
                      "properties": {
                        "screen": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "timestamp": {
                          "type": "integer"
                        }
                      }
                    }
                  },
                  "attachments": {
                    "type": "array",
                    "description": "Files already uploaded through /api/v1/upload-url.",
                    "items": {
                      "type": "object",
                      "required": [
                        "storage_id"
                      ],
                      "properties": {
                        "storage_id": {
                          "type": "string"
                        },
                        "file_type": {
                          "type": "string"
                        },
                        "file_name": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The report was stored.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "status"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "NEEDS_TRIAGE"
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON or a field that failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The account used every report in its billing period. Deliberately not 429: retrying cannot help.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error",
                    "code",
                    "quota"
                  ],
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "REPORT_QUOTA_EXCEEDED",
                        "STORAGE_QUOTA_EXCEEDED"
                      ]
                    },
                    "hint": {
                      "type": "string"
                    },
                    "quota": {
                      "type": "object",
                      "required": [
                        "limit",
                        "used"
                      ],
                      "properties": {
                        "limit": {
                          "type": "integer"
                        },
                        "used": {
                          "type": "integer"
                        },
                        "resets_at": {
                          "type": "integer",
                          "description": "Unix epoch milliseconds."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The request body is larger than 256 KB.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Bug reports"
        ],
        "operationId": "bugReportsPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/upload-url": {
      "post": {
        "tags": [
          "Bug reports"
        ],
        "operationId": "createUploadUrl",
        "summary": "Create an attachment upload URL",
        "description": "Requires the `write` scope. POST the file to the returned URL, then send the storage id back in `attachments`. Refused before the URL exists when the account is out of storage, so over-quota bytes are never uploaded.",
        "responses": {
          "200": {
            "description": "A single-use upload URL.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "uploadUrl"
                  ],
                  "properties": {
                    "uploadUrl": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "The account is out of attachment storage.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error",
                    "code",
                    "quota"
                  ],
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "REPORT_QUOTA_EXCEEDED",
                        "STORAGE_QUOTA_EXCEEDED"
                      ]
                    },
                    "hint": {
                      "type": "string"
                    },
                    "quota": {
                      "type": "object",
                      "required": [
                        "limit",
                        "used"
                      ],
                      "properties": {
                        "limit": {
                          "type": "integer"
                        },
                        "used": {
                          "type": "integer"
                        },
                        "resets_at": {
                          "type": "integer",
                          "description": "Unix epoch milliseconds."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Bug reports"
        ],
        "operationId": "uploadUrlPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/releases": {
      "get": {
        "tags": [
          "Releases"
        ],
        "operationId": "listReleases",
        "summary": "List published releases",
        "description": "Requires the `read` scope. Drafts are never returned.",
        "parameters": [
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "description": "Filter to one platform. Unknown values are ignored.",
            "schema": {
              "type": "string",
              "enum": [
                "ios",
                "android",
                "all"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of records to return.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Published releases, newest first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "releases"
                  ],
                  "properties": {
                    "releases": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "version": {
                            "type": "string"
                          },
                          "versionCode": {
                            "type": "string"
                          },
                          "platform": {
                            "type": "string",
                            "enum": [
                              "ios",
                              "android",
                              "all"
                            ]
                          },
                          "notes": {
                            "type": "string",
                            "description": "Release notes as Markdown."
                          },
                          "easUpdateId": {
                            "type": "string"
                          },
                          "channel": {
                            "type": "string"
                          },
                          "runtimeVersion": {
                            "type": "string"
                          },
                          "releasedAt": {
                            "type": "integer"
                          },
                          "createdAt": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Releases"
        ],
        "operationId": "releasesPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/announcements": {
      "get": {
        "tags": [
          "Announcements"
        ],
        "operationId": "listAnnouncements",
        "summary": "List active announcements",
        "description": "Requires the `read` scope.",
        "parameters": [
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "description": "Filter to one platform. Unknown values are ignored.",
            "schema": {
              "type": "string",
              "enum": [
                "ios",
                "android",
                "all"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of records to return.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Announcements currently in their window.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "announcements"
                  ],
                  "properties": {
                    "announcements": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "content": {
                            "type": "string",
                            "description": "Announcement body as Markdown."
                          },
                          "platform": {
                            "type": "string",
                            "enum": [
                              "ios",
                              "android",
                              "all"
                            ]
                          },
                          "ctaLabel": {
                            "type": "string"
                          },
                          "ctaUrl": {
                            "type": "string"
                          },
                          "publishedAt": {
                            "type": "integer"
                          },
                          "updatedAt": {
                            "type": "integer"
                          },
                          "createdAt": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Announcements"
        ],
        "operationId": "announcementsPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/identify": {
      "post": {
        "tags": [
          "End users"
        ],
        "operationId": "identifyEndUser",
        "summary": "Create or update an end-user profile",
        "description": "Requires the `write` scope. Send at least one of `user_identifier` or `anonymous_id`; later reports carrying the same value attach to this profile.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "anyOf": [
                  {
                    "required": [
                      "user_identifier"
                    ]
                  },
                  {
                    "required": [
                      "anonymous_id"
                    ]
                  }
                ],
                "properties": {
                  "user_identifier": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "anonymous_id": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 320
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "app_version": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "device_info": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Flat map of string values. At most 50 keys."
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Flat map of string values. At most 50 keys."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "An existing profile was updated.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "created"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "created": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    }
                  }
                }
              }
            }
          },
          "201": {
            "description": "A new profile was created.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "created"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "created": {
                      "type": "boolean",
                      "enum": [
                        true
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON or a field that failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The request body is larger than 256 KB.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "End users"
        ],
        "operationId": "identifyPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/feature-requests": {
      "get": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "listFeatureRequests",
        "summary": "List feature requests",
        "description": "Requires the `read` scope.",
        "responses": {
          "200": {
            "description": "Every feature request for the application.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "requests"
                  ],
                  "properties": {
                    "requests": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          },
                          "authorName": {
                            "type": "string"
                          },
                          "voteCount": {
                            "type": "integer"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "OPEN",
                              "IN_PROGRESS",
                              "COMPLETED",
                              "CLOSED"
                            ]
                          },
                          "createdAt": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "createFeatureRequest",
        "summary": "Submit a feature request",
        "description": "Requires the `write` scope.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "author_email"
                ],
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 10000
                  },
                  "author_name": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "author_email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 320
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The request was stored.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "status"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "OPEN"
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON or a field that failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The request body is larger than 256 KB.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "featureRequestsPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/feature-requests/vote": {
      "post": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "voteFeatureRequest",
        "summary": "Toggle a vote",
        "description": "Requires the `write` scope. Voting again removes the vote. Send at least one voter identity.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "feature_request_id"
                ],
                "anyOf": [
                  {
                    "required": [
                      "voter_email"
                    ]
                  },
                  {
                    "required": [
                      "anonymous_id"
                    ]
                  },
                  {
                    "required": [
                      "user_identifier"
                    ]
                  }
                ],
                "properties": {
                  "feature_request_id": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "voter_email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 320
                  },
                  "anonymous_id": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "user_identifier": {
                    "type": "string",
                    "maxLength": 200
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The vote state after the toggle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "voted",
                    "voteCount"
                  ],
                  "properties": {
                    "voted": {
                      "type": "boolean"
                    },
                    "voteCount": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON or a field that failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The request body is larger than 256 KB.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "featureRequestVotePreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/api/v1/feature-requests/votes": {
      "get": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "listFeatureRequestVotes",
        "summary": "List the feature requests one voter voted for",
        "description": "Requires the `read` scope. Send at least one voter identity as a query parameter.",
        "parameters": [
          {
            "name": "voter_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "email",
              "maxLength": 320
            }
          },
          {
            "name": "anonymous_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "user_identifier",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ids of the feature requests voted for.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "featureRequestIds"
                  ],
                  "properties": {
                    "featureRequestIds": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "No voter identity was supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Feature requests"
        ],
        "operationId": "featureRequestVotesPreflight",
        "summary": "CORS preflight",
        "security": [],
        "responses": {
          "204": {
            "description": "Allowed methods and headers."
          }
        }
      }
    },
    "/getImage": {
      "get": {
        "tags": [
          "Service"
        ],
        "operationId": "getImage",
        "summary": "Fetch a stored attachment",
        "description": "Requires the `read` scope. Only ids belonging to the key’s application are served.",
        "parameters": [
          {
            "name": "storageId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The stored file.",
            "content": {
              "*/*": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "No storageId was supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed, or unknown API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The API key lacks the scope this endpoint requires.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such file for this application.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-key rate limit exceeded. Retry after the `Retry-After` header.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Human-readable failure reason."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stable machine-readable code. Branch on this, not on the message.",
                      "examples": [
                        "unauthorized",
                        "invalid_request",
                        "rate_limited"
                      ]
                    },
                    "hint": {
                      "type": "string",
                      "description": "How to resolve the failure."
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
