{
  "openapi": "3.1.0",
  "info": {
    "title": "ezacto API",
    "version": "1.0.0",
    "description": "The native ezacto v1 contract. Contract and generated clients are deterministic build artifacts."
  },
  "servers": [
    {
      "url": "https://ezacto.io"
    }
  ],
  "paths": {
    "/auth/oidc/{provider}": {
      "get": {
        "operationId": "startOidcSignIn",
        "summary": "Start an OpenID Connect sign-in",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "302": {
            "description": "Redirect response",
            "headers": {
              "Location": {
                "description": "Redirect target",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/oidc/:provider",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/auth/oidc/{provider}/callback": {
      "get": {
        "operationId": "completeOidcSignIn",
        "summary": "Complete an OpenID Connect sign-in",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "303": {
            "description": "Redirect response",
            "headers": {
              "Location": {
                "description": "Redirect target",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/oidc/:provider/callback",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/auth/oidc/exchange": {
      "post": {
        "operationId": "exchangeOidcAppCode",
        "summary": "Exchange a native-app OIDC sign-in code for a session",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/oidc/exchange",
        "x-ezacto-generate-client": false
      }
    },
    "/auth/signup": {
      "post": {
        "operationId": "signup",
        "summary": "Create the first owner and send email verification",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "202": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthAcceptedEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/signup",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SignupInput"
              }
            }
          }
        }
      }
    },
    "/auth/verify-email": {
      "post": {
        "operationId": "verifyEmail",
        "summary": "Verify an email address",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthPrincipalEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/verify-email",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthTokenInput"
              }
            }
          }
        }
      }
    },
    "/auth/sign-in": {
      "post": {
        "operationId": "signIn",
        "summary": "Authenticate a verified email and password",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignInResultEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/sign-in",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasswordSignInInput"
              }
            }
          }
        }
      }
    },
    "/auth/two-factor/challenge": {
      "post": {
        "operationId": "completeTwoFactorChallenge",
        "summary": "Answer a two-factor challenge and receive the session",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorChallengeAcceptedEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/two-factor/challenge",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorChallengeInput"
              }
            }
          }
        }
      }
    },
    "/auth/password/forgot": {
      "post": {
        "operationId": "requestPasswordReset",
        "summary": "Request a password-reset email",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "202": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthAcceptedEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/password/forgot",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailInput"
              }
            }
          }
        }
      }
    },
    "/auth/password/reset": {
      "post": {
        "operationId": "resetPassword",
        "summary": "Consume a password-reset token",
        "tags": [
          "authentication"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthPrincipalEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/auth/password/reset",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasswordResetInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sessions": {
      "get": {
        "operationId": "listSessions",
        "summary": "List sessions for the acting user",
        "tags": [
          "authentication"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sessions",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/email-log": {
      "get": {
        "operationId": "listEmailLog",
        "summary": "List outbound email delivery outcomes",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailLogPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-log",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "queued",
                "sent",
                "bounced",
                "complained",
                "failed"
              ]
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      }
    },
    "/api/v1/email-health": {
      "get": {
        "operationId": "getEmailHealth",
        "summary": "Get email reputation health with bounce and complaint rates",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailHealthEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-health",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/email-template-variables": {
      "get": {
        "operationId": "listEmailTemplateVariables",
        "summary": "List the closed email-template variable vocabulary",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTemplateVariableCatalog"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-template-variables",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/email-templates": {
      "get": {
        "operationId": "listEmailTemplates",
        "summary": "List active versioned email templates",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTemplatePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-templates",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/email-templates/{kind}/versions": {
      "get": {
        "operationId": "listEmailTemplateVersions",
        "summary": "List immutable versions of an email template",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTemplatePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-templates/:kind/versions",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "operationId": "createEmailTemplateVersion",
        "summary": "Append an immutable email-template version",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTemplateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/email-templates/:kind/versions",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailTemplateVersionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities": {
      "get": {
        "operationId": "listSenderIdentities",
        "summary": "List organization sender identities and provider evidence",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "createSenderIdentity",
        "summary": "Configure an unverified organization sender identity",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderIdentityInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities/{id}": {
      "patch": {
        "operationId": "updateSenderIdentity",
        "summary": "Update sender display and Reply-To configuration",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderIdentityPatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities/{id}/default": {
      "post": {
        "operationId": "setDefaultSenderIdentity",
        "summary": "Select a fully verified default sender identity",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities/:id/default",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderIdentityVersionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities/{id}/archive": {
      "post": {
        "operationId": "archiveSenderIdentity",
        "summary": "Archive a non-default sender identity",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities/:id/archive",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderIdentityVersionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities/{id}/refresh": {
      "post": {
        "operationId": "refreshSenderIdentityEvidence",
        "summary": "Refresh authoritative sender verification evidence from its provider",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderIdentityEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities/:id/refresh",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderEvidenceRefreshInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/sender-identities/{id}/test-send": {
      "post": {
        "operationId": "testSendEmailTemplate",
        "summary": "Queue a persisted organization-template test to the acting administrator",
        "tags": [
          "email"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "202": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestSendEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sender-identities/:id/test-send",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailTestSendInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/activity-log": {
      "get": {
        "operationId": "listActivityLog",
        "summary": "List activity recorded from delivered domain events",
        "tags": [
          "activity"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityLogPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/activity-log",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "event_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "actor_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/outbox-deliveries": {
      "get": {
        "operationId": "listOutboxDeliveries",
        "summary": "List domain-event subscriber delivery outcomes",
        "tags": [
          "operations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboxDeliveryPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/outbox-deliveries",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "processing",
                "delivered",
                "failed"
              ]
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      }
    },
    "/api/v1/outbox-deliveries/{subscriberId}/{eventId}/retry": {
      "post": {
        "operationId": "retryOutboxDelivery",
        "summary": "Retry a failed domain-event subscriber delivery",
        "tags": [
          "operations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboxDeliveryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/outbox-deliveries/:subscriberId/:eventId/retry",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "subscriberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "eventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/sessions/{sessionId}": {
      "delete": {
        "operationId": "revokeSession",
        "summary": "Revoke a session for the acting user",
        "tags": [
          "authentication"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/sessions/:sessionId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1": {
      "get": {
        "operationId": "getApiRoot",
        "summary": "Get API service metadata",
        "tags": [
          "service"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/whoami": {
      "get": {
        "operationId": "getWhoami",
        "summary": "Get the authenticated user and credential authority",
        "tags": [
          "identity"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WhoamiEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/whoami",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/api-tokens": {
      "get": {
        "operationId": "listApiTokens",
        "summary": "List API tokens for the acting user",
        "tags": [
          "api-tokens"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiTokenListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/api-tokens",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "createApiToken",
        "summary": "Issue an API token",
        "tags": [
          "api-tokens"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IssuedApiTokenEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/api-tokens",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateApiTokenInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/api-tokens/{tokenId}": {
      "delete": {
        "operationId": "revokeApiToken",
        "summary": "Revoke an API token",
        "tags": [
          "api-tokens"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiTokenEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/api-tokens/:tokenId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "tokenId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/profile": {
      "get": {
        "operationId": "getProfile",
        "summary": "The signed-in user's own profile",
        "tags": [
          "profile"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/profile",
        "x-ezacto-generate-client": true
      },
      "patch": {
        "operationId": "updateProfile",
        "summary": "Update the signed-in user's own profile",
        "tags": [
          "profile"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/profile",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProfilePatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/clients": {
      "get": {
        "operationId": "listClients",
        "summary": "List clients",
        "tags": [
          "clients"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "parent_client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "bill_to_client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            }
          }
        ]
      },
      "post": {
        "operationId": "createClient",
        "summary": "Create a client",
        "tags": [
          "clients"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/clients/{id}": {
      "get": {
        "operationId": "getClient",
        "summary": "Get a client",
        "tags": [
          "clients"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateClient",
        "summary": "Update a client",
        "tags": [
          "clients"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteClient",
        "summary": "Delete or archive a client",
        "tags": [
          "clients"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/contacts": {
      "get": {
        "operationId": "listContacts",
        "summary": "List contacts",
        "tags": [
          "contacts"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/contacts",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ]
      },
      "post": {
        "operationId": "createContact",
        "summary": "Create a contact",
        "tags": [
          "contacts"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/contacts",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/contacts/{id}": {
      "get": {
        "operationId": "getContact",
        "summary": "Get a contact",
        "tags": [
          "contacts"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/contacts/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateContact",
        "summary": "Update a contact",
        "tags": [
          "contacts"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/contacts/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteContact",
        "summary": "Delete or archive a contact",
        "tags": [
          "contacts"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/contacts/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/expense-categories": {
      "get": {
        "operationId": "listExpenseCategories",
        "summary": "List expense-categories",
        "tags": [
          "expense-categories"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseCategoryPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expense-categories",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ]
      },
      "post": {
        "operationId": "createExpenseCategory",
        "summary": "Create a expensecategory",
        "tags": [
          "expense-categories"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseCategoryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expense-categories",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExpenseCategoryInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/expense-categories/{id}": {
      "get": {
        "operationId": "getExpenseCategory",
        "summary": "Get a expensecategory",
        "tags": [
          "expense-categories"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseCategoryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expense-categories/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateExpenseCategory",
        "summary": "Update a expensecategory",
        "tags": [
          "expense-categories"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseCategoryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expense-categories/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExpenseCategoryPatch"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteExpenseCategory",
        "summary": "Delete or archive a expensecategory",
        "tags": [
          "expense-categories"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expense-categories/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "List projects",
        "tags": [
          "projects"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            }
          }
        ]
      },
      "post": {
        "operationId": "createProject",
        "summary": "Create a project",
        "tags": [
          "projects"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/projects/{id}": {
      "get": {
        "operationId": "getProject",
        "summary": "Get a project",
        "tags": [
          "projects"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateProject",
        "summary": "Update a project",
        "tags": [
          "projects"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteProject",
        "summary": "Delete or archive a project",
        "tags": [
          "projects"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/tasks": {
      "get": {
        "operationId": "listTasks",
        "summary": "List tasks",
        "tags": [
          "tasks"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/tasks",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            }
          }
        ]
      },
      "post": {
        "operationId": "createTask",
        "summary": "Create a task",
        "tags": [
          "tasks"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/tasks",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/tasks/{id}": {
      "get": {
        "operationId": "getTask",
        "summary": "Get a task",
        "tags": [
          "tasks"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/tasks/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateTask",
        "summary": "Update a task",
        "tags": [
          "tasks"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/tasks/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteTask",
        "summary": "Delete or archive a task",
        "tags": [
          "tasks"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/tasks/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/task-assignments": {
      "get": {
        "operationId": "listTaskAssignments",
        "summary": "List task-assignments",
        "tags": [
          "task-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/task-assignments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "task_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ]
      },
      "post": {
        "operationId": "createTaskAssignment",
        "summary": "Create a taskassignment",
        "tags": [
          "task-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/task-assignments",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/task-assignments/{id}": {
      "get": {
        "operationId": "getTaskAssignment",
        "summary": "Get a taskassignment",
        "tags": [
          "task-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/task-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateTaskAssignment",
        "summary": "Update a taskassignment",
        "tags": [
          "task-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/task-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteTaskAssignment",
        "summary": "Delete or archive a taskassignment",
        "tags": [
          "task-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/task-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/user-assignments": {
      "get": {
        "operationId": "listUserAssignments",
        "summary": "List user-assignments",
        "tags": [
          "user-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/user-assignments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ]
      },
      "post": {
        "operationId": "createUserAssignment",
        "summary": "Create a userassignment",
        "tags": [
          "user-assignments"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/user-assignments",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/user-assignments/{id}": {
      "get": {
        "operationId": "getUserAssignment",
        "summary": "Get a userassignment",
        "tags": [
          "user-assignments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/user-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateUserAssignment",
        "summary": "Update a userassignment",
        "tags": [
          "user-assignments"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/user-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteUserAssignment",
        "summary": "Delete or archive a userassignment",
        "tags": [
          "user-assignments"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/user-assignments/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users": {
      "get": {
        "operationId": "listUsers",
        "summary": "List users",
        "tags": [
          "users"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "profile",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "member",
                "project_manager",
                "people_admin",
                "accounting",
                "executive_manager",
                "administrator"
              ]
            }
          },
          {
            "name": "is_contractor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      },
      "post": {
        "operationId": "createUser",
        "summary": "Create a user",
        "tags": [
          "users"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{id}": {
      "get": {
        "operationId": "getUser",
        "summary": "Get a user",
        "tags": [
          "users"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateUser",
        "summary": "Update a user",
        "tags": [
          "users"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteUser",
        "summary": "Delete or archive a user",
        "tags": [
          "users"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/roles": {
      "get": {
        "operationId": "listRoles",
        "summary": "List roles",
        "tags": [
          "roles"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourcePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/roles",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      },
      "post": {
        "operationId": "createRole",
        "summary": "Create a role",
        "tags": [
          "roles"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/roles",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/roles/{id}": {
      "get": {
        "operationId": "getRole",
        "summary": "Get a role",
        "tags": [
          "roles"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/roles/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateRole",
        "summary": "Update a role",
        "tags": [
          "roles"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralResourceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/roles/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMutationInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteRole",
        "summary": "Delete or archive a role",
        "tags": [
          "roles"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/roles/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users/{userId}/billable-rates": {
      "get": {
        "operationId": "listBillableRates",
        "summary": "List billable rates for a user",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRatePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      },
      "post": {
        "operationId": "appendBillableRate",
        "summary": "Append a billable rate for a user",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserRateInput"
              }
            }
          }
        }
      },
      "patch": {
        "operationId": "patchBillableRateCollectionNotAllowed",
        "summary": "BillableRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "deleteBillableRateCollectionNotAllowed",
        "summary": "BillableRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users/{userId}/billable-rates/{id}": {
      "get": {
        "operationId": "getBillableRate",
        "summary": "Get a billable rate",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "patchBillableRateNotAllowed",
        "summary": "BillableRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates/:id",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "deleteBillableRateNotAllowed",
        "summary": "BillableRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/billable-rates/:id",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users/{userId}/cost-rates": {
      "get": {
        "operationId": "listCostRates",
        "summary": "List cost rates for a user",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRatePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      },
      "post": {
        "operationId": "appendCostRate",
        "summary": "Append a cost rate for a user",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserRateInput"
              }
            }
          }
        }
      },
      "patch": {
        "operationId": "patchCostRateCollectionNotAllowed",
        "summary": "CostRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "deleteCostRateCollectionNotAllowed",
        "summary": "CostRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users/{userId}/cost-rates/{id}": {
      "get": {
        "operationId": "getCostRate",
        "summary": "Get a cost rate",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserRateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "patchCostRateNotAllowed",
        "summary": "CostRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates/:id",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "deleteCostRateNotAllowed",
        "summary": "CostRate records are append-only",
        "tags": [
          "user-rates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "405": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:userId/cost-rates/:id",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/time-entry-settings": {
      "get": {
        "operationId": "getTimeEntrySettings",
        "summary": "Get organization time-entry display and entry-mode settings",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntrySettingsEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entry-settings",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/time-entry-note-settings": {
      "get": {
        "operationId": "getTimeEntryNoteSettings",
        "summary": "Get organization time-entry note settings",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryNoteSettingsEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entry-note-settings",
        "x-ezacto-generate-client": true
      },
      "patch": {
        "operationId": "updateTimeEntryNoteSettings",
        "summary": "Update organization time-entry note settings",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryNoteSettingsEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entry-note-settings",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimeEntryNoteSettingsPatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/time-entry-options": {
      "get": {
        "operationId": "listTimeEntryOptions",
        "summary": "List the acting user's active project and task combinations",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryOptionListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entry-options",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/time-entries": {
      "get": {
        "operationId": "listTimeEntries",
        "summary": "List the acting user's time entries",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "spent_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "approval_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "unsubmitted",
                "submitted",
                "approved"
              ]
            }
          },
          {
            "name": "invoice_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Requires invoices:read for both the profile and token."
            }
          },
          {
            "name": "is_billed",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Requires invoices:read for both the profile and token."
            }
          },
          {
            "name": "billable",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "task_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "is_running",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "budgeted",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "external_reference_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "operationId": "createTimeEntry",
        "summary": "Create or start a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimeEntryInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/time-entries/{id}": {
      "get": {
        "operationId": "getTimeEntry",
        "summary": "Get a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateTimeEntry",
        "summary": "Update a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimeEntryPatch"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteTimeEntry",
        "summary": "Delete a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/time-entries/{id}/stop": {
      "post": {
        "operationId": "stopTimeEntry",
        "summary": "Stop a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries/:id/stop",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/time-entries/{id}/restart": {
      "post": {
        "operationId": "restartTimeEntry",
        "summary": "Restart a time entry",
        "tags": [
          "time-entries"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/time-entries/:id/restart",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions": {
      "get": {
        "operationId": "listTimesheetSubmissions",
        "summary": "List the acting user's timesheet submissions",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "period_start",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "period_end",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      },
      "post": {
        "operationId": "submitTimesheet",
        "summary": "Submit a timesheet period for approval",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetSubmissionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-submissions/pending": {
      "get": {
        "operationId": "listPendingTimesheetSubmissions",
        "summary": "List timesheet submissions awaiting review",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/pending",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "period_start",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "period_end",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions/approved": {
      "get": {
        "operationId": "listApprovedTimesheetSubmissions",
        "summary": "List recently approved timesheet periods available to reopen",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/approved",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "period_start",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "period_end",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions/{id}": {
      "get": {
        "operationId": "getTimesheetSubmission",
        "summary": "Get an owner- or approver-visible timesheet submission",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionDetailEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions/bulk-approve": {
      "post": {
        "operationId": "bulkApproveTimesheetSubmissions",
        "summary": "Approve an explicit selection of submitted timesheet periods",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetBulkApprovalResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/bulk-approve",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetBulkApprovalInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-submissions/{id}/approve": {
      "post": {
        "operationId": "approveTimesheetSubmission",
        "summary": "Approve a submitted timesheet period",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/:id/approve",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions/{id}/reject": {
      "post": {
        "operationId": "rejectTimesheetSubmission",
        "summary": "Reject a submitted timesheet period with a reason",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/:id/reject",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetRejectionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-submissions/{id}/unsubmit": {
      "post": {
        "operationId": "unsubmitTimesheetSubmission",
        "summary": "Take back your own timesheet before anyone has reviewed it",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/:id/unsubmit",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-submissions/{id}/withdraw": {
      "post": {
        "operationId": "withdrawTimesheetSubmission",
        "summary": "Explicitly withdraw or reopen a timesheet period",
        "tags": [
          "timesheet-approvals"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetSubmissionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-submissions/:id/withdraw",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetWithdrawalInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-lock-policy": {
      "get": {
        "operationId": "getTimesheetLockPolicy",
        "summary": "Get the organization timesheet lock policy",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockPolicyEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-lock-policy",
        "x-ezacto-generate-client": true
      },
      "patch": {
        "operationId": "updateTimesheetLockPolicy",
        "summary": "Update the organization timesheet lock policy",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockPolicyEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-lock-policy",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetLockPolicyPatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-locks": {
      "get": {
        "operationId": "listTimesheetLocks",
        "summary": "List durable timesheet lock windows",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockWindowPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-locks",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "manual",
                "auto"
              ]
            }
          }
        ]
      },
      "post": {
        "operationId": "createTimesheetManualLock",
        "summary": "Create an organization-wide manual lock cutoff",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockWindowEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-locks",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetManualLockInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/timesheet-locks/{id}": {
      "get": {
        "operationId": "getTimesheetLock",
        "summary": "Get a durable timesheet lock window",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockWindowEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-locks/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/timesheet-locks/{id}/unlock": {
      "post": {
        "operationId": "unlockTimesheetLock",
        "summary": "Explicitly unlock a timesheet lock window",
        "tags": [
          "timesheet-locks"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetLockWindowEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/timesheet-locks/:id/unlock",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetUnlockInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/expenses": {
      "get": {
        "operationId": "listExpenses",
        "summary": "List the acting user's expenses",
        "tags": [
          "expenses"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpensePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "spent_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "approval_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "unsubmitted",
                "submitted",
                "approved"
              ]
            }
          },
          {
            "name": "invoice_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Requires invoices:read for both the profile and token."
            }
          },
          {
            "name": "is_billed",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Requires invoices:read for both the profile and token."
            }
          },
          {
            "name": "billable",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "expense_category_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "reimbursable",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "reimbursement_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "pending",
                "approved",
                "paid"
              ]
            }
          }
        ]
      },
      "post": {
        "operationId": "createExpense",
        "summary": "Create an expense",
        "tags": [
          "expenses"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExpenseInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/expenses/{id}": {
      "get": {
        "operationId": "getExpense",
        "summary": "Get an expense",
        "tags": [
          "expenses"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateExpense",
        "summary": "Update an expense",
        "tags": [
          "expenses"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExpensePatch"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteExpense",
        "summary": "Delete an expense",
        "tags": [
          "expenses"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpenseEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/invoices": {
      "get": {
        "operationId": "listInvoices",
        "summary": "List invoices",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoicePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(draft|open|paid|closed)(,(draft|open|paid|closed))*$"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]*(,[1-9][0-9]*)*$"
            }
          }
        ]
      }
    },
    "/api/v1/invoices/{id}": {
      "get": {
        "operationId": "getInvoice",
        "summary": "Get an invoice",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateInvoice",
        "summary": "Apply one retry-safe invoice edit",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceEditInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/estimates": {
      "get": {
        "operationId": "listEstimates",
        "summary": "List estimates",
        "tags": [
          "estimates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimatePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      }
    },
    "/api/v1/estimates/{id}": {
      "get": {
        "operationId": "getEstimate",
        "summary": "Get an estimate",
        "tags": [
          "estimates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/estimates/{id}/messages": {
      "get": {
        "operationId": "listEstimateMessages",
        "summary": "List estimate lifecycle messages",
        "tags": [
          "estimate-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateMessageListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:id/messages",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createEstimateMessage",
        "summary": "Create a retry-safe estimate lifecycle message",
        "tags": [
          "estimate-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateMessageCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:id/messages",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EstimateMessageInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/estimates/{id}/convert": {
      "post": {
        "operationId": "convertEstimate",
        "summary": "Convert an accepted estimate into one draft invoice",
        "tags": [
          "estimates"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateConversionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:id/convert",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EstimateConversionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoice-generations": {
      "post": {
        "operationId": "generateInvoice",
        "summary": "Delegate transactional tracked-resource invoice generation",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoice-generations",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceGenerationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/line-items": {
      "post": {
        "operationId": "createInvoiceLine",
        "summary": "Add a parent-owned invoice line",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/line-items",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceLineInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/line-items/{lineId}": {
      "patch": {
        "operationId": "updateInvoiceLine",
        "summary": "Update a parent-owned invoice line",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/line-items/:lineId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "lineId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceLineUpdateInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteInvoiceLine",
        "summary": "Delete a parent-owned invoice line",
        "tags": [
          "invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/line-items/:lineId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "lineId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VersionedRowDeleteInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/messages": {
      "get": {
        "operationId": "listInvoiceMessages",
        "summary": "List invoice lifecycle messages",
        "tags": [
          "invoice-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceMessageListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/messages",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createInvoiceMessage",
        "summary": "Create an invoice lifecycle message",
        "tags": [
          "invoice-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/messages",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceMessageInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/transitions": {
      "post": {
        "operationId": "transitionInvoice",
        "summary": "Create the message equivalent of an invoice transition",
        "tags": [
          "invoice-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/transitions",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceTransitionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/deliveries": {
      "post": {
        "operationId": "deliverInvoiceEmail",
        "summary": "Confirm and durably enqueue invoice email delivery",
        "tags": [
          "invoice-messages"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "202": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/deliveries",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceEmailDeliveryInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/payments": {
      "get": {
        "operationId": "listInvoicePayments",
        "summary": "List effective invoice payments",
        "tags": [
          "invoice-payments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoicePaymentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/payments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "recordInvoicePayment",
        "summary": "Record a retry-safe manual invoice payment",
        "tags": [
          "invoice-payments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/payments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoicePaymentInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{id}/payments/{paymentId}": {
      "patch": {
        "operationId": "updateInvoicePayment",
        "summary": "Correct a retry-safe manual payment",
        "tags": [
          "invoice-payments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/payments/:paymentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "paymentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoicePaymentUpdateInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteInvoicePayment",
        "summary": "Delete a retry-safe manual payment",
        "tags": [
          "invoice-payments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceCommandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/payments/:paymentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "paymentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VersionedRowDeleteInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/retainers": {
      "get": {
        "operationId": "listRetainers",
        "summary": "List retainers with live balances",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[1-9][0-9]*(,[1-9][0-9]*)*$"
            }
          }
        ]
      },
      "post": {
        "operationId": "createRetainer",
        "summary": "Create a single-denomination retainer",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetainerInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/retainers/{id}": {
      "get": {
        "operationId": "getRetainer",
        "summary": "Get a retainer",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateRetainer",
        "summary": "Update a retainer",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetainerPatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/retainers/{id}/ledger": {
      "get": {
        "operationId": "listRetainerLedger",
        "summary": "List append-only retainer movements",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerLedgerListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers/:id/ledger",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "appendRetainerLedger",
        "summary": "Append a stable retainer movement",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerLedgerMutationEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers/:id/ledger",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetainerLedgerInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/retainers/{id}/drawdowns": {
      "post": {
        "operationId": "drawDownRetainer",
        "summary": "Draw down a retainer and return its new balance",
        "tags": [
          "retainers"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetainerLedgerMutationEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/retainers/:id/drawdowns",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetainerDrawdownInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/recurring-invoices": {
      "get": {
        "operationId": "listRecurringInvoices",
        "summary": "List recurring invoice definitions",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringInvoicePage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ]
      },
      "post": {
        "operationId": "createRecurringInvoice",
        "summary": "Create a recurring invoice definition",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringInvoiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecurringInvoiceInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/recurring-invoices/{id}": {
      "get": {
        "operationId": "getRecurringInvoice",
        "summary": "Get a recurring invoice definition",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringInvoiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateRecurringInvoice",
        "summary": "Replace a recurring invoice definition",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringInvoiceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecurringInvoiceInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteRecurringInvoice",
        "summary": "Delete a recurring invoice definition",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/recurring-invoices/{id}/claim-backfill": {
      "post": {
        "operationId": "backfillRecurringInvoiceClaims",
        "summary": "Rehearse or apply the claims a band was issued too early to make",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BandClaimBackfillEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id/claim-backfill",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BandClaimBackfillInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/recurring-invoices/{id}/generations": {
      "post": {
        "operationId": "generateRecurringInvoice",
        "summary": "Issue the invoice this definition is due for",
        "tags": [
          "recurring-invoices"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringGenerationEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id/generations",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/invoices/{invoiceId}/attachments": {
      "get": {
        "operationId": "listInvoiceAttachments",
        "summary": "List attachments owned by a invoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:invoiceId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "invoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createInvoiceAttachment",
        "summary": "Upload an attachment owned by a invoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:invoiceId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "invoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]+$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AttachmentUploadInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/invoices/{invoiceId}/attachments/{attachmentId}": {
      "get": {
        "operationId": "getInvoiceAttachment",
        "summary": "Get metadata for a invoice attachment",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:invoiceId/attachments/:attachmentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "invoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/invoices/{invoiceId}/attachments/{attachmentId}/content": {
      "get": {
        "operationId": "downloadInvoiceAttachment",
        "summary": "Download an attachment owned by a invoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Attachment content",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:invoiceId/attachments/:attachmentId/content",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "invoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/recurring-invoices/{recurringInvoiceId}/attachments": {
      "get": {
        "operationId": "listRecurringInvoiceAttachments",
        "summary": "List attachments owned by a recurringinvoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:recurringInvoiceId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "recurringInvoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createRecurringInvoiceAttachment",
        "summary": "Upload an attachment owned by a recurringinvoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:recurringInvoiceId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "recurringInvoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]+$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AttachmentUploadInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}": {
      "get": {
        "operationId": "getRecurringInvoiceAttachment",
        "summary": "Get metadata for a recurringinvoice attachment",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:recurringInvoiceId/attachments/:attachmentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "recurringInvoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}/content": {
      "get": {
        "operationId": "downloadRecurringInvoiceAttachment",
        "summary": "Download an attachment owned by a recurringinvoice",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Attachment content",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:recurringInvoiceId/attachments/:attachmentId/content",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "recurringInvoiceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/estimates/{estimateId}/attachments": {
      "get": {
        "operationId": "listEstimateAttachments",
        "summary": "List attachments owned by a estimate",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:estimateId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "estimateId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createEstimateAttachment",
        "summary": "Upload an attachment owned by a estimate",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:estimateId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "estimateId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]+$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AttachmentUploadInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/estimates/{estimateId}/attachments/{attachmentId}": {
      "get": {
        "operationId": "getEstimateAttachment",
        "summary": "Get metadata for a estimate attachment",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:estimateId/attachments/:attachmentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "estimateId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/estimates/{estimateId}/attachments/{attachmentId}/content": {
      "get": {
        "operationId": "downloadEstimateAttachment",
        "summary": "Download an attachment owned by a estimate",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Attachment content",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/estimates/:estimateId/attachments/:attachmentId/content",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "estimateId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/expenses/{expenseId}/attachments": {
      "get": {
        "operationId": "listExpenseAttachments",
        "summary": "List attachments owned by a expense",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:expenseId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "expenseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createExpenseAttachment",
        "summary": "Upload an attachment owned by a expense",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:expenseId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "expenseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]+$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AttachmentUploadInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/expenses/{expenseId}/attachments/{attachmentId}": {
      "get": {
        "operationId": "getExpenseAttachment",
        "summary": "Get metadata for a expense attachment",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:expenseId/attachments/:attachmentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "expenseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/expenses/{expenseId}/attachments/{attachmentId}/content": {
      "get": {
        "operationId": "downloadExpenseAttachment",
        "summary": "Download an attachment owned by a expense",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Attachment content",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/expenses/:expenseId/attachments/:attachmentId/content",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "expenseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/projects/{projectId}/attachments": {
      "get": {
        "operationId": "listProjectAttachments",
        "summary": "List attachments owned by a project",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:projectId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "createProjectAttachment",
        "summary": "Upload an attachment owned by a project",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:projectId/attachments",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]+$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AttachmentUploadInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/projects/{projectId}/attachments/{attachmentId}": {
      "get": {
        "operationId": "getProjectAttachment",
        "summary": "Get metadata for a project attachment",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:projectId/attachments/:attachmentId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/projects/{projectId}/attachments/{attachmentId}/content": {
      "get": {
        "operationId": "downloadProjectAttachment",
        "summary": "Download an attachment owned by a project",
        "tags": [
          "attachments"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Attachment content",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/projects/:projectId/attachments/:attachmentId/content",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/report-definitions/registry": {
      "get": {
        "operationId": "getReportDefinitionRegistry",
        "summary": "List report builder fields and metrics",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportDefinitionRegistryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/registry",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/report-definitions": {
      "get": {
        "operationId": "listSavedReports",
        "summary": "List report definitions visible to the acting user",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedReportListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "view",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "yours",
                "shared"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "custom_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      },
      "post": {
        "operationId": "createSavedReport",
        "summary": "Save a report definition",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedReportInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/report-definitions/preview": {
      "post": {
        "operationId": "previewReportDefinition",
        "summary": "Run an unsaved report definition",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportRunnerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/preview",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedReportInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/report-definitions/{reportId}": {
      "get": {
        "operationId": "getSavedReport",
        "summary": "Read a saved report definition",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateSavedReport",
        "summary": "Update a saved report at an expected version",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedReportUpdate"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteSavedReport",
        "summary": "Delete an owned saved report",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/report-definitions/{reportId}/duplicate": {
      "post": {
        "operationId": "duplicateSavedReport",
        "summary": "Duplicate a visible report into the acting user's library",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/duplicate",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/report-definitions/{reportId}/pin": {
      "post": {
        "operationId": "pinSavedReport",
        "summary": "Pin a visible saved report",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/pin",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "operationId": "unpinSavedReport",
        "summary": "Unpin a visible saved report",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/pin",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/report-definitions/{reportId}/shares/{userId}": {
      "post": {
        "operationId": "shareSavedReport",
        "summary": "Share an owned report with a teammate",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/shares/:userId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "unshareSavedReport",
        "summary": "Revoke a teammate's report share",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/shares/:userId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/report-definitions/{reportId}/run": {
      "post": {
        "operationId": "runSavedReport",
        "summary": "Run the exact current version of a saved report",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportRunnerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/report-definitions/:reportId/run",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/reports/my-hours": {
      "get": {
        "operationId": "getMyHoursReport",
        "summary": "Report the acting user's own tracked hours by project",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MyHoursReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/my-hours",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/reports/time": {
      "get": {
        "operationId": "getTimeReport",
        "summary": "Report tracked time by client, project, task and teammate",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/time",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "include_fixed_fee",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/api/v1/reports/invoiced": {
      "get": {
        "operationId": "getInvoicedReport",
        "summary": "List invoices issued in a period with paid and balance amounts",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoicedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/invoiced",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "draft",
                "open",
                "paid",
                "closed"
              ]
            }
          }
        ]
      }
    },
    "/api/v1/reports/payments-received": {
      "get": {
        "operationId": "getPaymentsReceivedReport",
        "summary": "List invoice payments received in a period",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentsReceivedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/payments-received",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/reports/receivables": {
      "get": {
        "operationId": "getReceivablesReport",
        "summary": "Age outstanding invoice balances by client as of a date",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReceivablesReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/receivables",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "as_of",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/reports/contractor": {
      "get": {
        "operationId": "getContractorCostReport",
        "summary": "Total what each person cost over a period",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractorCostReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/contractor",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/reports/month-end": {
      "get": {
        "operationId": "getMonthEndManifest",
        "summary": "What a month-end pack would send, before anybody sends it",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonthEndManifestEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/month-end",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/reports/banded-months": {
      "get": {
        "operationId": "getBandedMonthReport",
        "summary": "What a banded month was worth at full rates, against what it charged",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BandedMonthReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/banded-months",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/reports/band-cost-alert": {
      "get": {
        "operationId": "getBandCostAlert",
        "summary": "Read the organisation cost-share threshold for banded work",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BandCostAlertEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/band-cost-alert",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "setBandCostAlert",
        "summary": "Set the organisation cost-share threshold for banded work",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BandCostAlertEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/band-cost-alert",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BandCostAlertInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/reports/profitability": {
      "get": {
        "operationId": "getProfitabilityReport",
        "summary": "Revenue, cost and profit per project against the window before it",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfitabilityReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/profitability",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "project_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "active",
                "archived"
              ]
            }
          },
          {
            "name": "billing_method",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "non_billable",
                "time_materials",
                "fixed_fee"
              ]
            }
          },
          {
            "name": "manager_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "tag_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/reports/detailed-expense": {
      "get": {
        "operationId": "getDetailedExpenseReport",
        "summary": "List every expense in a period, one row each",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DetailedExpenseReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/detailed-expense",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "category_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "billable",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "reimbursable",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "invoice_state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "invoiced",
                "uninvoiced"
              ]
            }
          },
          {
            "name": "active_projects_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/api/v1/reports/uninvoiced": {
      "get": {
        "operationId": "getUninvoicedReport",
        "summary": "Report uninvoiced tracked time and expenses",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UninvoicedReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/uninvoiced",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/reports/detailed-time": {
      "get": {
        "operationId": "getDetailedTimeReport",
        "summary": "List tracked time by date, task and person",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DetailedTimeReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/detailed-time",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "task_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "role_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "tag_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "billable",
                "non_billable",
                "uninvoiced",
                "claimed",
                "unclaimed"
              ]
            }
          },
          {
            "name": "grain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "day",
                "entry"
              ]
            }
          },
          {
            "name": "invoice_state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "invoiced",
                "uninvoiced"
              ]
            }
          },
          {
            "name": "active_projects_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/api/v1/reports/detailed-time/actions": {
      "post": {
        "operationId": "executeDetailedTimeAction",
        "summary": "Apply a confirmed idempotent action to selected time rows",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTimeActionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/detailed-time/actions",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReportTimeActionInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/reports/client-rollups/{clientId}": {
      "get": {
        "operationId": "getClientRollupReport",
        "summary": "Roll up reporting metrics through a client subtree",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientRollupReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/client-rollups/:clientId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "clientId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/reports/project-budgets": {
      "get": {
        "operationId": "listProjectBudgetSummaries",
        "summary": "Report budget consumption for every visible project",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectBudgetSummaryListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/project-budgets",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/reports/project-budget/{projectId}": {
      "get": {
        "operationId": "getProjectBudgetReport",
        "summary": "Report project budget consumption",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectBudgetReportEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/reports/project-budget/:projectId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ]
      }
    },
    "/api/v1/admin/modules": {
      "get": {
        "operationId": "listModules",
        "summary": "List module enabled states",
        "tags": [
          "admin-modules"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModuleListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/admin/modules",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/admin/modules/{module}": {
      "patch": {
        "operationId": "updateModule",
        "summary": "Enable or disable a module",
        "tags": [
          "admin-modules"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModuleListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/admin/modules/:module",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "module",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModulePatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/admin/sign-in-methods": {
      "get": {
        "operationId": "listSignInMethods",
        "summary": "List sign-in methods with their configured and enabled states",
        "tags": [
          "admin-modules"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignInMethodListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/admin/sign-in-methods",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/admin/sign-in-methods/{method}": {
      "patch": {
        "operationId": "updateSignInMethod",
        "summary": "Switch a sign-in method on or off",
        "tags": [
          "admin-modules"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignInMethodListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/admin/sign-in-methods/:method",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "method",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModulePatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/backup/status": {
      "get": {
        "operationId": "getBackupStatus",
        "summary": "The last completed and last failed backup run, and recent history",
        "tags": [
          "backup"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/backup/status",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/quickbooks": {
      "get": {
        "operationId": "getQuickBooksConnection",
        "summary": "Whether QuickBooks is configured, and the connected company",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuickBooksStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/quickbooks",
        "x-ezacto-generate-client": true
      },
      "delete": {
        "operationId": "disconnectQuickBooks",
        "summary": "Disconnect the QuickBooks company and revoke the grant",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/quickbooks",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/quickbooks/authorize": {
      "post": {
        "operationId": "startQuickBooksAuthorization",
        "summary": "Begin connecting a QuickBooks company",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuickBooksAuthorizeEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/quickbooks/authorize",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/quickbooks/settings": {
      "post": {
        "operationId": "updateQuickBooksSettings",
        "summary": "Whether mirrored invoices offer QuickBooks payment links",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuickBooksConnectionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/quickbooks/settings",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuickBooksSettingsInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/integrations/quickbooks/callback": {
      "get": {
        "operationId": "completeQuickBooksAuthorization",
        "summary": "Where Intuit returns an administrator after they approve",
        "tags": [
          "integrations"
        ],
        "security": [],
        "responses": {
          "302": {
            "description": "Redirect response",
            "headers": {
              "Location": {
                "description": "Redirect target",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/quickbooks/callback",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "code",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "realmId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/integrations/wise": {
      "get": {
        "operationId": "getWiseConnection",
        "summary": "Whether Wise is configured, and which profile pays",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/wise/recipients": {
      "get": {
        "operationId": "listWiseRecipients",
        "summary": "The Wise destinations the organisation can pay",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseRecipientListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/recipients",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "onboardWiseRecipient",
        "summary": "Create a Wise destination from a contractor's email and link it",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseLinkEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/recipients",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WiseOnboardInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/integrations/wise/proposals": {
      "get": {
        "operationId": "listWisePayoutProposals",
        "summary": "People with no payout destination, and who at Wise they might be",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseProposalListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/proposals",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/wise/destinations/{userId}": {
      "get": {
        "operationId": "getWisePayoutDestination",
        "summary": "Where one person is currently paid, if anywhere",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseDestinationEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/destinations/:userId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "delete": {
        "operationId": "removeWisePayoutDestination",
        "summary": "Remove a person's Wise payout destination",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/destinations/:userId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/integrations/wise/contacts": {
      "post": {
        "operationId": "shareWiseProfile",
        "summary": "Point a person at their own Wise profile, found by a Wisetag",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseContactEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/contacts",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WiseContactInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/integrations/wise/recipients/link": {
      "post": {
        "operationId": "linkWiseRecipient",
        "summary": "Point a person at the Wise destination they are paid through",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WiseLinkEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/recipients/link",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WiseLinkInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/integrations/wise/recipients/{accountId}": {
      "delete": {
        "operationId": "unlinkWiseRecipient",
        "summary": "Detach a person's Wise payout destination",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/wise/recipients/:accountId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "accountId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/settings/sso-domains": {
      "get": {
        "operationId": "listSsoProvisioningDomains",
        "summary": "List SSO provisioning domains and their DNS challenges",
        "tags": [
          "sso-domains"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SsoDomainListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/sso-domains",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "addSsoProvisioningDomain",
        "summary": "Claim a domain and issue its DNS challenge",
        "tags": [
          "sso-domains"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SsoDomainEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/sso-domains",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SsoDomainInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/sso-domains/{id}": {
      "delete": {
        "operationId": "removeSsoProvisioningDomain",
        "summary": "Remove a provisioning domain",
        "tags": [
          "sso-domains"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/sso-domains/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/settings/sso-domains/{id}/verify": {
      "post": {
        "operationId": "verifySsoProvisioningDomain",
        "summary": "Check the DNS challenge and record the result",
        "tags": [
          "sso-domains"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SsoDomainCheckEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/sso-domains/:id/verify",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/brand": {
      "get": {
        "operationId": "getBrand",
        "summary": "Get the organisation name and brand marks for any principal",
        "tags": [
          "brand-assets"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/brand",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/settings/brand-assets": {
      "get": {
        "operationId": "listBrandAssets",
        "summary": "List the brand marks stored on this instance",
        "tags": [
          "brand-assets"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandAssetListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/brand-assets",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/settings/brand-assets/{slot}": {
      "post": {
        "operationId": "uploadBrandAsset",
        "summary": "Store a brand mark, replacing whatever the slot held",
        "tags": [
          "brand-assets"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandAssetEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/brand-assets/:slot",
        "x-ezacto-generate-client": false,
        "parameters": [
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BrandAssetUploadInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "removeBrandAsset",
        "summary": "Discard a stored brand mark and fall back to configuration",
        "tags": [
          "brand-assets"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/brand-assets/:slot",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/settings/theme": {
      "get": {
        "operationId": "getInstanceTheme",
        "summary": "The palette this instance wears, or null for the built-in theme",
        "tags": [
          "instance-theme"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceThemeEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/theme",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "setInstanceTheme",
        "summary": "Replace the instance palette, subject to the contrast rule",
        "tags": [
          "instance-theme"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceThemeEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/theme",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstanceThemeInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "clearInstanceTheme",
        "summary": "Return this instance to the built-in theme",
        "tags": [
          "instance-theme"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/theme",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/invoices/{id}/payment-link": {
      "post": {
        "operationId": "getInvoicePaymentLink",
        "summary": "The URL a client pays this invoice at, minted once and reused",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoicePaymentLinkEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/payment-link",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/invoices/{id}/released-time": {
      "post": {
        "operationId": "releaseInvoicedTime",
        "summary": "Hand this invoice's time entries back, once it no longer stands",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReleasedTimeEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/released-time",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/invoices/{id}/document-preference": {
      "get": {
        "operationId": "getInvoiceDocumentPreference",
        "summary": "Whether this invoice will carry its document, and why",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceDocumentPreferenceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/document-preference",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "setInvoiceDocumentPreference",
        "summary": "Attach this invoice's document, refuse it, or follow the organization",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceDocumentPreferenceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/document-preference",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/settings/invoice-documents": {
      "get": {
        "operationId": "getOrganizationInvoiceDocuments",
        "summary": "Whether invoices carry their document by default",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceDocumentsEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-documents",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "setOrganizationInvoiceDocuments",
        "summary": "Set whether invoices carry their document by default",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceDocumentsEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-documents",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/invoices/{id}/thank-you-preference": {
      "get": {
        "operationId": "getInvoiceThankYouPreference",
        "summary": "Whether this invoice will thank its client when it settles, and why",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceThankYouPreferenceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/thank-you-preference",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "setInvoiceThankYouPreference",
        "summary": "Thank this invoice's client, refuse to, or follow the organization",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceThankYouPreferenceEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/invoices/:id/thank-you-preference",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/settings/invoice-thank-you": {
      "get": {
        "operationId": "getOrganizationInvoiceThankYou",
        "summary": "Whether settled invoices thank their client by default",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceThankYouEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-thank-you",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "setOrganizationInvoiceThankYou",
        "summary": "Set whether settled invoices thank their client by default",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceThankYouEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-thank-you",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/settings/invoice-reminders": {
      "get": {
        "operationId": "getOrganizationInvoiceReminders",
        "summary": "The default payment reminder policy for overdue invoices",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceRemindersEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-reminders",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "setOrganizationInvoiceReminders",
        "summary": "Set, or switch off, the default payment reminder policy",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvoiceRemindersEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/settings/invoice-reminders",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrganizationInvoiceRemindersInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/recurring-invoices/incomplete": {
      "get": {
        "operationId": "listIncompleteRecurringInvoices",
        "summary": "Recurring definitions an import could not finish, and what bills against them",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncompleteRecurringInvoiceListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/incomplete",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/recurring-invoices/{id}/completion": {
      "post": {
        "operationId": "completeRecurringInvoiceDefinition",
        "summary": "Give an unfinished recurring definition its terms",
        "tags": [
          "money"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecurringInvoiceCompletionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/recurring-invoices/:id/completion",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/users/{id}/payout-accounts": {
      "get": {
        "operationId": "listPayoutAccounts",
        "summary": "The payout accounts a person is currently payable through",
        "tags": [
          "payout-accounts"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoutAccountListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id/payout-accounts",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "linkPayoutAccount",
        "summary": "Link a person to their account at a payout provider",
        "tags": [
          "payout-accounts"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoutAccountEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id/payout-accounts",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayoutAccountInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/payout-accounts/{id}": {
      "delete": {
        "operationId": "detachPayoutAccount",
        "summary": "Detach a payout account; re-attaching is a new link",
        "tags": [
          "payout-accounts"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/payout-accounts/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/integrations/bill": {
      "get": {
        "operationId": "getBillStatus",
        "summary": "Whether this deployment can reach BILL, and how it can deliver",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/bill",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/integrations/bill/clients/{id}": {
      "get": {
        "operationId": "getBillClientDelivery",
        "summary": "Whether this client is billed through BILL",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillClientDeliveryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/bill/clients/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "post": {
        "operationId": "setBillClientDelivery",
        "summary": "Bill this client through BILL, or stop",
        "tags": [
          "integrations"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillClientDeliveryEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/integrations/bill/clients/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillClientDeliveryInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/two-factor": {
      "get": {
        "operationId": "getTwoFactorStatus",
        "summary": "Report whether a second factor is enrolled, pending, or absent",
        "tags": [
          "two-factor"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/two-factor",
        "x-ezacto-generate-client": true
      },
      "post": {
        "operationId": "beginTwoFactorEnrolment",
        "summary": "Issue a TOTP seed and recovery codes, pending confirmation",
        "tags": [
          "two-factor"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorEnrolmentEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/two-factor",
        "x-ezacto-generate-client": true
      },
      "delete": {
        "operationId": "disableTwoFactor",
        "summary": "Remove the second factor, on presentation of a current code",
        "tags": [
          "two-factor"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/two-factor",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorCodeInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/two-factor/confirm": {
      "post": {
        "operationId": "confirmTwoFactorEnrolment",
        "summary": "Prove the authenticator holds the seed and turn the factor on",
        "tags": [
          "two-factor"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/two-factor/confirm",
        "x-ezacto-generate-client": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorCodeInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{id}/emails": {
      "post": {
        "operationId": "addUserEmail",
        "summary": "Add a second email address and send its verification",
        "tags": [
          "users"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "202": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserEmailAcceptedEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/users/:id/emails",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserEmailInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/team/status": {
      "get": {
        "operationId": "getTeamStatus",
        "summary": "Get Team module availability for navigation",
        "tags": [
          "team"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamStatusEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/status",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/team/people": {
      "get": {
        "operationId": "listTeamPeople",
        "summary": "List Team people with authoritative utilization",
        "tags": [
          "team"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamPersonSummaryPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "is_active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/api/v1/team/people/{id}": {
      "get": {
        "operationId": "getTeamPerson",
        "summary": "Get a Team person editor record",
        "tags": [
          "team"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamPersonEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "operationId": "updateTeamPerson",
        "summary": "Update a Team person with optimistic concurrency",
        "tags": [
          "team"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCommandReceiptEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeamPersonPatch"
              }
            }
          }
        }
      }
    },
    "/api/v1/team/catalog": {
      "get": {
        "operationId": "getTeamCatalog",
        "summary": "Get roles, departments, and assignable projects",
        "tags": [
          "team"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCatalogEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/catalog",
        "x-ezacto-generate-client": true
      }
    },
    "/api/v1/team/people/{id}/project-assignments/replace": {
      "post": {
        "operationId": "replaceTeamPersonProjectAssignments",
        "summary": "Replace a person's active project assignments",
        "tags": [
          "team"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCommandReceiptEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id/project-assignments/replace",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeamAssignmentReplaceInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/team/people/{id}/notifications": {
      "post": {
        "operationId": "updateTeamPersonNotifications",
        "summary": "Persist inactive notification preferences; delivery is unavailable",
        "tags": [
          "team"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCommandReceiptEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id/notifications",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeamNotificationInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/team/people/{id}/rates": {
      "post": {
        "operationId": "appendTeamPersonRate",
        "summary": "Append an effective-dated person rate",
        "tags": [
          "team"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCommandReceiptEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id/rates",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeamRateInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/team/people/{id}/rates/{rateId}": {
      "delete": {
        "operationId": "removeTeamPersonRate",
        "summary": "Remove a person rate that has priced nothing",
        "tags": [
          "team"
        ],
        "security": [
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeamCommandReceiptEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/team/people/:id/rates/:rateId",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "rateId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeamRateRemovalInput"
              }
            }
          }
        }
      }
    },
    "/api/v1/clients/{id}/ancestors": {
      "get": {
        "operationId": "listClientAncestors",
        "summary": "List ancestors of a client in the hierarchy",
        "tags": [
          "client-tree"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientHierarchyListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients/:id/ancestors",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/api/v1/clients/{id}/descendants": {
      "get": {
        "operationId": "listClientDescendants",
        "summary": "List descendants of a client in the hierarchy",
        "tags": [
          "client-tree"
        ],
        "security": [
          {
            "bearerAuth": []
          },
          {
            "cookieSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientHierarchyListEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/MalformedRequest"
          },
          "401": {
            "$ref": "#/components/responses/AuthenticationRequired"
          },
          "403": {
            "$ref": "#/components/responses/InsufficientPermission"
          },
          "404": {
            "$ref": "#/components/responses/ResourceNotFound"
          },
          "409": {
            "$ref": "#/components/responses/StateConflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/ServiceUnavailable"
          }
        },
        "x-ezacto-runtime-path": "/api/v1/clients/:id/descendants",
        "x-ezacto-generate-client": true,
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      },
      "cookieSession": {
        "type": "apiKey",
        "in": "cookie",
        "name": "__Host-ezacto_session"
      }
    },
    "responses": {
      "MalformedRequest": {
        "description": "Malformed request",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "AuthenticationRequired": {
        "description": "Authentication required",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "InsufficientPermission": {
        "description": "Insufficient permission",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "ResourceNotFound": {
        "description": "Resource not found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "StateConflict": {
        "description": "State conflict",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "Payload too large",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "ValidationFailed": {
        "description": "Validation failed",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limited",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "ServiceUnavailable": {
        "description": "Service unavailable",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      }
    },
    "schemas": {
      "AttachmentUploadInput": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          }
        },
        "additionalProperties": false
      },
      "Attachment": {
        "type": "object",
        "required": [
          "id",
          "name",
          "content_hash",
          "byte_size",
          "content_type",
          "uploaded_by_user_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "content_hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "byte_size": {
            "type": "integer",
            "minimum": 0
          },
          "content_type": {
            "type": "string"
          },
          "uploaded_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "AttachmentEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Attachment"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "AttachmentListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Attachment"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoiceReminderPolicy": {
        "type": "object",
        "required": [
          "first_after_days",
          "every_days"
        ],
        "properties": {
          "first_after_days": {
            "type": "integer",
            "minimum": 0
          },
          "every_days": {
            "type": "integer",
            "minimum": 1
          }
        },
        "additionalProperties": false
      },
      "FieldError": {
        "type": "object",
        "required": [
          "field",
          "code",
          "message"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "minimum_length": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        },
        "additionalProperties": false
      },
      "ErrorDetail": {
        "type": "object",
        "required": [
          "code",
          "message",
          "fields"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FieldError"
            }
          }
        },
        "additionalProperties": false
      },
      "ErrorEnvelope": {
        "type": "object",
        "required": [
          "error",
          "request_id"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ErrorDetail"
          },
          "request_id": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "SignupInput": {
        "type": "object",
        "required": [
          "organization_name",
          "first_name",
          "last_name",
          "email",
          "password"
        ],
        "properties": {
          "organization_name": {
            "type": "string"
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "password": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "AuthTokenInput": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "PasswordSignInInput": {
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "password": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "EmailInput": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          }
        },
        "additionalProperties": false
      },
      "PasswordResetInput": {
        "type": "object",
        "required": [
          "token",
          "password"
        ],
        "properties": {
          "token": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "AuthAccepted": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "verification_sent",
              "reset_requested"
            ]
          }
        },
        "additionalProperties": false
      },
      "AuthAcceptedEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AuthAccepted"
          }
        },
        "additionalProperties": false
      },
      "AuthPrincipal": {
        "type": "object",
        "required": [
          "status",
          "user_id",
          "profile",
          "manager_grants"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "authenticated",
              "password_reset"
            ]
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "profile": {
            "type": "string",
            "enum": [
              "member",
              "project_manager",
              "people_admin",
              "accounting",
              "executive_manager",
              "administrator"
            ]
          },
          "manager_grants": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "AuthPrincipalEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AuthPrincipal"
          }
        },
        "additionalProperties": false
      },
      "Session": {
        "type": "object",
        "required": [
          "id",
          "created_at",
          "last_seen_at",
          "idle_expires_at",
          "absolute_expires_at",
          "revoked_at",
          "revocation_reason",
          "current"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time"
          },
          "idle_expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "absolute_expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "revoked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "revocation_reason": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "user_revoked",
                  "privilege_change",
                  "password_reset",
                  "user_disabled"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "current": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SessionEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Session"
          }
        },
        "additionalProperties": false
      },
      "SessionPage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Session"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EmailRecipient": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "EmailLog": {
        "type": "object",
        "required": [
          "id",
          "from",
          "reply_to",
          "to",
          "template",
          "subject",
          "provider",
          "provider_message_id",
          "provider_request_id",
          "provider_latency_ms",
          "status",
          "related_type",
          "related_id",
          "attempt_count",
          "failure_code",
          "failure_reason",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "from": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailRecipient"
              },
              {
                "type": "null"
              }
            ]
          },
          "reply_to": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailRecipient"
            }
          },
          "to": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailRecipient"
            }
          },
          "template": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "provider": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_message_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_request_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_latency_ms": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 3000000
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "sent",
              "bounced",
              "complained",
              "failed"
            ]
          },
          "related_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "related_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "attempt_count": {
            "type": "integer",
            "minimum": 0
          },
          "failure_code": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "queue_unavailable",
                  "provider_timeout",
                  "provider_rejected"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "failure_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "EmailLogPage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailLog"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EmailReputationSnapshot": {
        "type": "object",
        "required": [
          "sent",
          "bounced",
          "complained",
          "failed",
          "bounce_rate_ppm",
          "complaint_rate_ppm"
        ],
        "properties": {
          "sent": {
            "type": "integer",
            "minimum": 0
          },
          "bounced": {
            "type": "integer",
            "minimum": 0
          },
          "complained": {
            "type": "integer",
            "minimum": 0
          },
          "failed": {
            "type": "integer",
            "minimum": 0
          },
          "bounce_rate_ppm": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000
          },
          "complaint_rate_ppm": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000
          }
        },
        "additionalProperties": false
      },
      "EmailHealth": {
        "type": "object",
        "required": [
          "reputation"
        ],
        "properties": {
          "reputation": {
            "$ref": "#/components/schemas/EmailReputationSnapshot"
          }
        },
        "additionalProperties": false
      },
      "EmailHealthEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EmailHealth"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EmailTemplateVariable": {
        "type": "object",
        "required": [
          "name",
          "token",
          "description",
          "compatibility"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "token": {
            "type": "string",
            "pattern": "^%[a-z0-9_]+%$"
          },
          "description": {
            "type": "string"
          },
          "compatibility": {
            "type": "string",
            "enum": [
              "harvest",
              "native"
            ]
          }
        },
        "additionalProperties": false
      },
      "EmailTemplateVariableGroup": {
        "type": "object",
        "required": [
          "kind",
          "variables"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "thank_you",
              "auth_email_verification",
              "auth_password_reset"
            ]
          },
          "variables": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailTemplateVariable"
            }
          }
        },
        "additionalProperties": false
      },
      "EmailTemplateVariableCatalog": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailTemplateVariableGroup"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EmailTemplate": {
        "type": "object",
        "required": [
          "kind",
          "version",
          "subject_template",
          "text_template",
          "html_template",
          "unknown_variable_policy",
          "created_by_user_id",
          "created_at"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "thank_you",
              "auth_email_verification",
              "auth_password_reset"
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "subject_template": {
            "type": "string"
          },
          "text_template": {
            "type": "string"
          },
          "html_template": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "unknown_variable_policy": {
            "type": "string",
            "enum": [
              "error",
              "literal"
            ]
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "EmailTemplatePage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmailTemplate"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EmailTemplateEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EmailTemplate"
          }
        },
        "additionalProperties": false
      },
      "EmailTemplateVersionInput": {
        "type": "object",
        "required": [
          "expected_version",
          "subject_template",
          "text_template"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 1
          },
          "subject_template": {
            "type": "string",
            "minLength": 1,
            "maxLength": 998
          },
          "text_template": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000000
          },
          "html_template": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000000
              },
              {
                "type": "null"
              }
            ]
          },
          "unknown_variable_policy": {
            "type": "string",
            "enum": [
              "error",
              "literal"
            ]
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityEvidence": {
        "type": "object",
        "required": [
          "version",
          "source",
          "identity_kind",
          "verification_status",
          "dkim_status",
          "mail_from_domain",
          "mail_from_status",
          "observed_at"
        ],
        "properties": {
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "source": {
            "type": "string",
            "enum": [
              "provider_api",
              "deployment_config"
            ]
          },
          "identity_kind": {
            "type": "string",
            "enum": [
              "email_address",
              "domain"
            ]
          },
          "verification_status": {
            "type": "string",
            "enum": [
              "pending",
              "verified",
              "failed",
              "temporary_failure",
              "operator_configured"
            ]
          },
          "dkim_status": {
            "type": "string",
            "enum": [
              "pending",
              "verified",
              "failed",
              "not_applicable"
            ]
          },
          "mail_from_domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "mail_from_status": {
            "type": "string",
            "enum": [
              "pending",
              "verified",
              "failed",
              "not_configured"
            ]
          },
          "observed_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SenderIdentity": {
        "type": "object",
        "required": [
          "id",
          "email",
          "display_name",
          "reply_to_email",
          "provider",
          "provider_identity",
          "is_default",
          "version",
          "archived_at",
          "evidence",
          "created_by_user_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "display_name": {
            "type": "string"
          },
          "reply_to_email": {
            "anyOf": [
              {
                "type": "string",
                "format": "email"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "string"
          },
          "provider_identity": {
            "type": "string"
          },
          "is_default": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "archived_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "evidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SenderIdentityEvidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_by_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityPage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SenderIdentity"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SenderIdentity"
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityInput": {
        "type": "object",
        "required": [
          "email",
          "display_name",
          "provider",
          "provider_identity"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254
          },
          "display_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "reply_to_email": {
            "anyOf": [
              {
                "type": "string",
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "provider_identity": {
            "type": "string",
            "minLength": 1,
            "maxLength": 320
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityPatch": {
        "type": "object",
        "required": [
          "expected_version"
        ],
        "minProperties": 2,
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "display_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "reply_to_email": {
            "anyOf": [
              {
                "type": "string",
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "SenderIdentityVersionInput": {
        "type": "object",
        "required": [
          "expected_version"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "BackupRun": {
        "type": "object",
        "required": [
          "id",
          "status",
          "trigger",
          "started_at",
          "completed_at",
          "r2_prefix",
          "table_count",
          "total_rows",
          "error_message"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "completed",
              "failed"
            ]
          },
          "trigger": {
            "type": "string",
            "enum": [
              "nightly",
              "manual"
            ]
          },
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "r2_prefix": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "table_count": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "total_rows": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "BackupStatusEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "last_completed",
              "last_failed",
              "recent_runs",
              "has_failure"
            ],
            "properties": {
              "last_completed": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/BackupRun"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "last_failed": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/BackupRun"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "recent_runs": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/BackupRun"
                }
              },
              "has_failure": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "QuickBooksConnection": {
        "type": "object",
        "required": [
          "realm_id",
          "company_name",
          "scope",
          "allow_online_payment",
          "connected_at"
        ],
        "properties": {
          "realm_id": {
            "type": "string"
          },
          "company_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "scope": {
            "type": "string"
          },
          "allow_online_payment": {
            "type": "boolean"
          },
          "connected_at": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "QuickBooksStatusEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "configured",
              "connection"
            ],
            "properties": {
              "configured": {
                "type": "boolean"
              },
              "connection": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/QuickBooksConnection"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "QuickBooksAuthorizeEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "authorize_url"
            ],
            "properties": {
              "authorize_url": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "WiseConnection": {
        "type": "object",
        "required": [
          "profile_id",
          "profile_name",
          "payable_recipients",
          "webhooks_verifiable"
        ],
        "properties": {
          "profile_id": {
            "type": "string"
          },
          "profile_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "payable_recipients": {
            "type": "integer"
          },
          "webhooks_verifiable": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "WiseRecipient": {
        "type": "object",
        "required": [
          "id",
          "holder_name",
          "currency",
          "type",
          "masked_summary",
          "email"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "holder_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "masked_summary": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "WiseStatusEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "configured",
              "connection"
            ],
            "properties": {
              "configured": {
                "type": "boolean"
              },
              "connection": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/WiseConnection"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "WiseRecipientListEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WiseRecipient"
            }
          }
        },
        "additionalProperties": false
      },
      "WiseOnboardInput": {
        "type": "object",
        "required": [
          "user_id",
          "email",
          "legal_name",
          "currency"
        ],
        "properties": {
          "user_id": {
            "type": "integer"
          },
          "email": {
            "type": "string"
          },
          "legal_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "WiseDestinationEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "configured",
              "destination"
            ],
            "properties": {
              "configured": {
                "type": "boolean"
              },
              "destination": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "id",
                      "kind",
                      "linked_at",
                      "linked_by_user_id",
                      "verified_at"
                    ],
                    "properties": {
                      "id": {
                        "type": "integer"
                      },
                      "kind": {
                        "type": "string",
                        "enum": [
                          "account",
                          "contact"
                        ]
                      },
                      "linked_at": {
                        "type": "string"
                      },
                      "linked_by_user_id": {
                        "type": "integer"
                      },
                      "verified_at": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "WiseProposal": {
        "type": "object",
        "required": [
          "user_id",
          "name",
          "payroll_email",
          "matches"
        ],
        "properties": {
          "user_id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "payroll_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WiseRecipient"
            }
          }
        },
        "additionalProperties": false
      },
      "WiseProposalListEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WiseProposal"
            }
          }
        },
        "additionalProperties": false
      },
      "WiseContactInput": {
        "type": "object",
        "required": [
          "user_id",
          "identifier",
          "currency"
        ],
        "properties": {
          "user_id": {
            "type": "integer"
          },
          "identifier": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "WiseContactEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "user_id",
              "contact"
            ],
            "properties": {
              "user_id": {
                "type": "integer"
              },
              "contact": {
                "type": "object",
                "required": [
                  "id",
                  "name"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "WiseLinkInput": {
        "type": "object",
        "required": [
          "user_id",
          "recipient_id"
        ],
        "properties": {
          "user_id": {
            "type": "integer"
          },
          "recipient_id": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "WiseLinkEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "user_id",
              "recipient"
            ],
            "properties": {
              "user_id": {
                "type": "integer"
              },
              "recipient": {
                "$ref": "#/components/schemas/WiseRecipient"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "QuickBooksConnectionEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/QuickBooksConnection"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "QuickBooksSettingsInput": {
        "type": "object",
        "required": [
          "allow_online_payment"
        ],
        "properties": {
          "allow_online_payment": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SenderEvidenceRefreshInput": {
        "type": "object",
        "required": [
          "expected_evidence_version"
        ],
        "properties": {
          "expected_evidence_version": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "EmailTestSendInput": {
        "type": "object",
        "required": [
          "template_kind",
          "template_version",
          "variables",
          "confirmed"
        ],
        "properties": {
          "template_kind": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "thank_you"
            ]
          },
          "template_version": {
            "type": "integer",
            "minimum": 1
          },
          "variables": {
            "type": "object",
            "maxProperties": 32,
            "propertyNames": {
              "pattern": "^[a-z][a-z0-9_]{0,63}$"
            },
            "additionalProperties": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            }
          },
          "confirmed": {
            "const": true
          }
        },
        "additionalProperties": false
      },
      "EmailTestSend": {
        "type": "object",
        "required": [
          "status",
          "delivery_id",
          "sender_identity_id",
          "template_kind",
          "template_version",
          "recipient_email"
        ],
        "properties": {
          "status": {
            "const": "queued"
          },
          "delivery_id": {
            "type": "integer",
            "minimum": 1
          },
          "sender_identity_id": {
            "type": "integer",
            "minimum": 1
          },
          "template_kind": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "thank_you"
            ]
          },
          "template_version": {
            "type": "integer",
            "minimum": 1
          },
          "recipient_email": {
            "type": "string",
            "format": "email"
          }
        },
        "additionalProperties": false
      },
      "EmailTestSendEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EmailTestSend"
          }
        },
        "additionalProperties": false
      },
      "OutboxAggregate": {
        "type": "object",
        "required": [
          "type",
          "id",
          "sequence"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "sequence": {
            "type": "integer",
            "minimum": 1
          }
        },
        "additionalProperties": false
      },
      "ActivityLog": {
        "type": "object",
        "required": [
          "event_id",
          "event_type",
          "aggregate",
          "payload",
          "occurred_at",
          "available_at",
          "recorded_at"
        ],
        "properties": {
          "event_id": {
            "type": "string"
          },
          "event_type": {
            "type": "string"
          },
          "aggregate": {
            "$ref": "#/components/schemas/OutboxAggregate"
          },
          "payload": {
            "type": "object",
            "additionalProperties": true
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time"
          },
          "available_at": {
            "type": "string",
            "format": "date-time"
          },
          "recorded_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ActivityLogPage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ActivityLog"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "OutboxDelivery": {
        "type": "object",
        "required": [
          "subscriber_id",
          "event_id",
          "event_type",
          "aggregate",
          "status",
          "attempt_count",
          "next_attempt_at",
          "last_error_code",
          "delivered_at",
          "failed_at",
          "occurred_at",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "subscriber_id": {
            "type": "string"
          },
          "event_id": {
            "type": "string"
          },
          "event_type": {
            "type": "string"
          },
          "aggregate": {
            "$ref": "#/components/schemas/OutboxAggregate"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "delivered",
              "failed"
            ]
          },
          "attempt_count": {
            "type": "integer",
            "minimum": 0
          },
          "next_attempt_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "last_error_code": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "subscriber_timeout",
                  "subscriber_rejected"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "delivered_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "failed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "OutboxDeliveryPage": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OutboxDelivery"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "OutboxDeliveryEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/OutboxDelivery"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "Links": {
        "type": "object",
        "required": [
          "self"
        ],
        "properties": {
          "self": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "PageLinks": {
        "type": "object",
        "required": [
          "self",
          "next"
        ],
        "properties": {
          "self": {
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "PageMetadata": {
        "type": "object",
        "required": [
          "per_page",
          "next_cursor"
        ],
        "properties": {
          "per_page": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "Service": {
        "type": "object",
        "required": [
          "service",
          "version"
        ],
        "properties": {
          "service": {
            "const": "ezacto"
          },
          "version": {
            "const": "v1"
          }
        },
        "additionalProperties": false
      },
      "ServiceEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Service"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TokenAuthentication": {
        "type": "object",
        "required": [
          "kind",
          "token_id",
          "scopes"
        ],
        "properties": {
          "kind": {
            "const": "token"
          },
          "token_id": {
            "type": "integer",
            "minimum": 1
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "time_entries:read",
                "time_entries:write",
                "projects:read",
                "projects:write",
                "clients:read",
                "clients:write",
                "invoices:read",
                "invoices:write",
                "expenses:read",
                "expenses:write",
                "team:read",
                "schedule:read",
                "schedule:write",
                "reports:read"
              ]
            }
          }
        },
        "additionalProperties": false
      },
      "SessionAuthentication": {
        "type": "object",
        "required": [
          "kind"
        ],
        "properties": {
          "kind": {
            "const": "session"
          }
        },
        "additionalProperties": false
      },
      "Whoami": {
        "type": "object",
        "required": [
          "user_id",
          "profile",
          "manager_grants",
          "authentication"
        ],
        "properties": {
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "profile": {
            "type": "string",
            "enum": [
              "member",
              "project_manager",
              "people_admin",
              "accounting",
              "executive_manager",
              "administrator"
            ]
          },
          "manager_grants": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "authentication": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TokenAuthentication"
              },
              {
                "$ref": "#/components/schemas/SessionAuthentication"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "WhoamiEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Whoami"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "GeneralResource": {
        "type": "object",
        "description": "Commercial fields are omitted without finance/admin authority or an explicit billable_rates_manager grant. The same authority is required to set them; resource read/write scopes still apply.",
        "x-commercial-fields": {
          "clients": [
            "payment_terms",
            "default_tax_pct",
            "default_tax2_pct",
            "default_discount_pct"
          ],
          "projects": [
            "billing_method",
            "bill_by",
            "billing_currency"
          ],
          "contacts": [
            "invoice_recipient_status"
          ]
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "GeneralMutationInput": {
        "type": "object",
        "description": "Commercial fields listed on GeneralResource require the same commercial authority for create and update, in addition to resource write scope.",
        "minProperties": 1,
        "additionalProperties": true
      },
      "GeneralResourceEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/GeneralResource"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "GeneralResourcePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GeneralResource"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "ExpenseCategory": {
        "type": "object",
        "required": [
          "id",
          "name",
          "unit_name",
          "unit_price_cents",
          "is_active",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "unit_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "unit_price_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9000000000000
              },
              {
                "type": "null"
              }
            ]
          },
          "is_active": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ExpenseCategoryInput": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "unit_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "unit_price_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9000000000000
              },
              {
                "type": "null"
              }
            ]
          },
          "is_active": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ExpenseCategoryPatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "name": {
            "type": "string"
          },
          "unit_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "unit_price_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9000000000000
              },
              {
                "type": "null"
              }
            ]
          },
          "is_active": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ExpenseCategoryEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ExpenseCategory"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ExpenseCategoryPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExpenseCategory"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "UserRate": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "amount_cents",
          "start_date",
          "end_date",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "amount_cents": {
            "type": "integer",
            "minimum": 0
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "end_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "UserRateInput": {
        "type": "object",
        "required": [
          "expected_version",
          "amount_cents"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "amount_cents": {
            "type": "integer",
            "minimum": 0
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "UserRateEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/UserRate"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "UserRatePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserRate"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "TeamStatus": {
        "type": "object",
        "required": [
          "enabled"
        ],
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TeamStatusEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TeamStatus"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TeamNamedRelation": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TeamPersonSummary": {
        "type": "object",
        "required": [
          "id",
          "first_name",
          "last_name",
          "email",
          "avatar_url",
          "profile",
          "is_owner",
          "is_contractor",
          "is_active",
          "weekly_capacity",
          "total_seconds",
          "billable_seconds",
          "nonbillable_seconds",
          "utilization_ppm",
          "running"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "avatar_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "profile": {
            "type": "string",
            "enum": [
              "member",
              "project_manager",
              "people_admin",
              "accounting",
              "executive_manager",
              "administrator"
            ]
          },
          "is_owner": {
            "type": "boolean"
          },
          "is_contractor": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "weekly_capacity": {
            "type": "integer",
            "minimum": 0
          },
          "total_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "nonbillable_seconds": {
            "type": "integer"
          },
          "utilization_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "running": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TeamPersonSummaryPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamPersonSummary"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "TeamProjectAssignment": {
        "type": "object",
        "required": [
          "id",
          "project_id",
          "project_name",
          "project_code",
          "client_id",
          "client_name",
          "is_active",
          "is_project_manager",
          "use_default_rates",
          "budget_seconds",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "is_project_manager": {
            "type": "boolean"
          },
          "use_default_rates": {
            "type": "boolean"
          },
          "hourly_rate_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "budget_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TeamNotificationChannels": {
        "type": "object",
        "required": [
          "email",
          "desktop",
          "slack"
        ],
        "properties": {
          "email": {
            "type": "boolean"
          },
          "desktop": {
            "type": "boolean"
          },
          "slack": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TeamInactiveNotificationChannels": {
        "type": "object",
        "required": [
          "email",
          "desktop",
          "slack"
        ],
        "properties": {
          "email": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "desktop": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "slack": {
            "type": "boolean",
            "enum": [
              false
            ]
          }
        },
        "additionalProperties": false
      },
      "TeamNotificationPreference": {
        "type": "object",
        "required": [
          "delivery_active",
          "daily_reminder_enabled",
          "reminder_time",
          "reminder_days",
          "channels",
          "include_in_team_reminders",
          "weekly_digest",
          "notify_project_deleted",
          "updated_at"
        ],
        "properties": {
          "delivery_active": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "daily_reminder_enabled": {
            "type": "boolean"
          },
          "reminder_time": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
              },
              {
                "type": "null"
              }
            ]
          },
          "reminder_days": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "monday",
                "tuesday",
                "wednesday",
                "thursday",
                "friday",
                "saturday",
                "sunday"
              ]
            }
          },
          "channels": {
            "$ref": "#/components/schemas/TeamNotificationChannels"
          },
          "include_in_team_reminders": {
            "type": "boolean"
          },
          "weekly_digest": {
            "type": "boolean"
          },
          "notify_project_deleted": {
            "type": "boolean"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TeamPerson": {
        "type": "object",
        "required": [
          "id",
          "first_name",
          "last_name",
          "email",
          "telephone",
          "employee_id",
          "timezone",
          "is_contractor",
          "is_active",
          "has_access_to_all_future_projects",
          "weekly_capacity",
          "profile",
          "is_owner",
          "avatar_url",
          "version",
          "created_at",
          "updated_at",
          "roles",
          "departments",
          "project_assignments",
          "notifications"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "telephone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "employee_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "timezone": {
            "type": "string"
          },
          "is_contractor": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "has_access_to_all_future_projects": {
            "type": "boolean"
          },
          "weekly_capacity": {
            "type": "integer",
            "minimum": 0
          },
          "profile": {
            "type": "string",
            "enum": [
              "member",
              "project_manager",
              "people_admin",
              "accounting",
              "executive_manager",
              "administrator"
            ]
          },
          "is_owner": {
            "type": "boolean"
          },
          "avatar_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamNamedRelation"
            }
          },
          "departments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamNamedRelation"
            }
          },
          "project_assignments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamProjectAssignment"
            }
          },
          "billable_rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserRate"
            }
          },
          "cost_rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserRate"
            }
          },
          "notifications": {
            "$ref": "#/components/schemas/TeamNotificationPreference"
          }
        },
        "additionalProperties": false
      },
      "TeamPersonEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TeamPerson"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TeamCatalogProject": {
        "type": "object",
        "required": [
          "id",
          "name",
          "code",
          "client_id",
          "client_name",
          "is_active"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TeamCatalog": {
        "type": "object",
        "required": [
          "roles",
          "departments",
          "projects"
        ],
        "properties": {
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamNamedRelation"
            }
          },
          "departments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamNamedRelation"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeamCatalogProject"
            }
          }
        },
        "additionalProperties": false
      },
      "TeamCatalogEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TeamCatalog"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TeamPersonPatch": {
        "type": "object",
        "required": [
          "expected_version"
        ],
        "minProperties": 2,
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "first_name": {
            "type": "string",
            "minLength": 1
          },
          "last_name": {
            "type": "string",
            "minLength": 1
          },
          "telephone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "employee_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "timezone": {
            "type": "string",
            "minLength": 1
          },
          "is_contractor": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "has_access_to_all_future_projects": {
            "type": "boolean"
          },
          "weekly_capacity": {
            "type": "integer",
            "minimum": 0
          },
          "profile": {
            "type": "string",
            "enum": [
              "member",
              "project_manager",
              "people_admin",
              "accounting",
              "executive_manager",
              "administrator"
            ]
          },
          "role_ids": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "department_ids": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "additionalProperties": false
      },
      "TeamAssignmentInput": {
        "type": "object",
        "required": [
          "project_id",
          "is_project_manager"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "is_project_manager": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TeamAssignmentReplaceInput": {
        "type": "object",
        "required": [
          "expected_version",
          "assignments"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "assignments": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "$ref": "#/components/schemas/TeamAssignmentInput"
            }
          }
        },
        "additionalProperties": false
      },
      "TeamNotificationInput": {
        "type": "object",
        "required": [
          "expected_version",
          "daily_reminder_enabled",
          "reminder_time",
          "reminder_days",
          "channels",
          "include_in_team_reminders",
          "weekly_digest",
          "notify_project_deleted"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "daily_reminder_enabled": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "reminder_time": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
              },
              {
                "type": "null"
              }
            ]
          },
          "reminder_days": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "monday",
                "tuesday",
                "wednesday",
                "thursday",
                "friday",
                "saturday",
                "sunday"
              ]
            }
          },
          "channels": {
            "$ref": "#/components/schemas/TeamInactiveNotificationChannels"
          },
          "include_in_team_reminders": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "weekly_digest": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "notify_project_deleted": {
            "type": "boolean",
            "enum": [
              false
            ]
          }
        },
        "additionalProperties": false
      },
      "TeamRateInput": {
        "type": "object",
        "required": [
          "expected_version",
          "kind",
          "amount_cents",
          "start_date"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string",
            "enum": [
              "billable",
              "cost"
            ]
          },
          "amount_cents": {
            "type": "integer",
            "minimum": 0
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TeamRateRemovalInput": {
        "type": "object",
        "required": [
          "expected_version",
          "kind"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string",
            "enum": [
              "billable",
              "cost"
            ]
          }
        },
        "additionalProperties": false
      },
      "TeamCommandReceipt": {
        "type": "object",
        "required": [
          "target_user_id",
          "version",
          "resource_id",
          "occurred_at"
        ],
        "properties": {
          "target_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "resource_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TeamCommandReceiptEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TeamCommandReceipt"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ApiToken": {
        "type": "object",
        "required": [
          "id",
          "name",
          "scopes",
          "token_hint",
          "created_at",
          "last_used_at",
          "expires_at",
          "revoked_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "time_entries:read",
                "time_entries:write",
                "projects:read",
                "projects:write",
                "clients:read",
                "clients:write",
                "invoices:read",
                "invoices:write",
                "expenses:read",
                "expenses:write",
                "team:read",
                "schedule:read",
                "schedule:write",
                "reports:read"
              ]
            }
          },
          "token_hint": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_used_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "revoked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "IssuedApiToken": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ApiToken"
          },
          {
            "type": "object",
            "required": [
              "token"
            ],
            "properties": {
              "token": {
                "type": "string"
              }
            }
          }
        ]
      },
      "CreateApiTokenInput": {
        "type": "object",
        "required": [
          "name",
          "scopes"
        ],
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "scopes": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "time_entries:read",
                "time_entries:write",
                "projects:read",
                "projects:write",
                "clients:read",
                "clients:write",
                "invoices:read",
                "invoices:write",
                "expenses:read",
                "expenses:write",
                "team:read",
                "schedule:read",
                "schedule:write",
                "reports:read"
              ]
            }
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "ApiTokenEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ApiToken"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "IssuedApiTokenEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/IssuedApiToken"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ApiTokenListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiToken"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimeEntry": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "project_id",
          "task_id",
          "spent_date",
          "seconds",
          "is_running",
          "billable",
          "budgeted",
          "approval_status",
          "is_locked",
          "minimum_note_length",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_assignment_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_assignment_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "seconds": {
            "type": "integer"
          },
          "seconds_without_timer": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "is_running": {
            "type": "boolean"
          },
          "timer_started_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "started_time": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[0-2][0-9]:[0-5][0-9]$"
              },
              {
                "type": "null"
              }
            ]
          },
          "ended_time": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[0-2][0-9]:[0-5][0-9]$"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "billable": {
            "type": "boolean"
          },
          "budgeted": {
            "type": "boolean"
          },
          "approval_status": {
            "type": "string",
            "enum": [
              "unsubmitted",
              "submitted",
              "approved"
            ]
          },
          "source_approval_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "unsubmitted",
                  "submitted",
                  "approved"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "description": "Omitted without invoices:read authority (profile and token)."
          },
          "is_billed": {
            "type": "boolean",
            "description": "Omitted without invoices:read authority (profile and token)."
          },
          "is_locked": {
            "type": "boolean"
          },
          "locked_reason_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "locked_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "external_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "calendar_event_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "minimum_note_length": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          },
          "billable_rate_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_rate_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TimeEntryInput": {
        "type": "object",
        "required": [
          "project_id",
          "task_id"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "seconds": {
            "type": "integer",
            "minimum": 0
          },
          "started_time": {
            "type": "string"
          },
          "ended_time": {
            "type": "string"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "budgeted": {
            "type": "boolean"
          },
          "external_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "calendar_event_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TimeEntryPatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "seconds": {
            "type": "integer",
            "minimum": 0
          },
          "started_time": {
            "type": "string"
          },
          "ended_time": {
            "type": "string"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "budgeted": {
            "type": "boolean"
          },
          "external_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "calendar_event_ref": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TimeEntryEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimeEntry"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimeEntryPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeEntry"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "TimeEntrySettings": {
        "type": "object",
        "required": [
          "time_entry_mode",
          "time_format",
          "clock",
          "week_start_day"
        ],
        "properties": {
          "time_entry_mode": {
            "type": "string",
            "enum": [
              "duration",
              "start_end"
            ]
          },
          "time_format": {
            "type": "string",
            "enum": [
              "decimal",
              "hours_minutes"
            ]
          },
          "clock": {
            "type": "string",
            "enum": [
              "12h",
              "24h"
            ]
          },
          "week_start_day": {
            "type": "string",
            "enum": [
              "saturday",
              "sunday",
              "monday"
            ]
          }
        },
        "additionalProperties": false
      },
      "TimeEntrySettingsEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimeEntrySettings"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimeEntryNoteSettings": {
        "type": "object",
        "required": [
          "required",
          "minimum_length"
        ],
        "properties": {
          "required": {
            "type": "boolean"
          },
          "minimum_length": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        },
        "additionalProperties": false
      },
      "TimeEntryNoteSettingsPatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "required": {
            "type": "boolean"
          },
          "minimum_length": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10000
          }
        },
        "additionalProperties": false
      },
      "TimeEntryNoteSettingsEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimeEntryNoteSettings"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "Profile": {
        "type": "object",
        "required": [
          "user_id",
          "timezone"
        ],
        "properties": {
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "timezone": {
            "type": "string",
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "ProfilePatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "timezone": {
            "type": "string",
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "ProfileEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Profile"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimeEntryOption": {
        "type": "object",
        "required": [
          "project_id",
          "task_id",
          "minimum_note_length"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "minimum_note_length": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000
          }
        },
        "additionalProperties": false
      },
      "TimeEntryOptionListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeEntryOption"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmission": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "user_name",
          "period_start",
          "period_end",
          "status",
          "origin",
          "source_status",
          "source_observed_at",
          "submitted_by_user_id",
          "submitted_at",
          "reviewed_by_user_id",
          "reviewed_at",
          "rejection_reason",
          "version",
          "entry_count",
          "expense_count",
          "total_seconds",
          "billable_seconds",
          "nonbillable_seconds",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_name": {
            "type": "string"
          },
          "period_start": {
            "type": "string",
            "format": "date"
          },
          "period_end": {
            "type": "string",
            "format": "date"
          },
          "status": {
            "type": "string",
            "enum": [
              "unsubmitted",
              "submitted",
              "approved"
            ]
          },
          "origin": {
            "type": "string",
            "enum": [
              "native",
              "harvest_import",
              "legacy_backfill"
            ]
          },
          "source_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "submitted",
                  "approved"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "source_observed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "submitted_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "submitted_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "reviewed_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "reviewed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "rejection_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "expense_count": {
            "type": "integer",
            "minimum": 0
          },
          "total_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "nonbillable_seconds": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionInput": {
        "type": "object",
        "required": [
          "period_start",
          "period_end"
        ],
        "properties": {
          "period_start": {
            "type": "string",
            "format": "date"
          },
          "period_end": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionEntry": {
        "type": "object",
        "required": [
          "id",
          "spent_date",
          "project_id",
          "project_name",
          "task_id",
          "task_name",
          "seconds",
          "notes"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_name": {
            "type": "string"
          },
          "seconds": {
            "type": "integer"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionExpense": {
        "type": "object",
        "required": [
          "id",
          "spent_date",
          "project_id",
          "project_name",
          "expense_category_id",
          "expense_category_name",
          "total_cost_cents",
          "currency",
          "notes"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "expense_category_id": {
            "type": "integer",
            "minimum": 1
          },
          "expense_category_name": {
            "type": "string"
          },
          "total_cost_cents": {
            "type": "integer",
            "minimum": -9000000000000,
            "maximum": 9000000000000
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionDetail": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "user_name",
          "period_start",
          "period_end",
          "status",
          "origin",
          "source_status",
          "source_observed_at",
          "submitted_by_user_id",
          "submitted_at",
          "reviewed_by_user_id",
          "reviewed_at",
          "rejection_reason",
          "version",
          "entry_count",
          "expense_count",
          "total_seconds",
          "billable_seconds",
          "nonbillable_seconds",
          "created_at",
          "updated_at",
          "entries",
          "expenses"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_name": {
            "type": "string"
          },
          "period_start": {
            "type": "string",
            "format": "date"
          },
          "period_end": {
            "type": "string",
            "format": "date"
          },
          "status": {
            "type": "string",
            "enum": [
              "unsubmitted",
              "submitted",
              "approved"
            ]
          },
          "origin": {
            "type": "string",
            "enum": [
              "native",
              "harvest_import",
              "legacy_backfill"
            ]
          },
          "source_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "submitted",
                  "approved"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "source_observed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "submitted_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "submitted_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "reviewed_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "reviewed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "rejection_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "expense_count": {
            "type": "integer",
            "minimum": 0
          },
          "total_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "nonbillable_seconds": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimesheetSubmissionEntry"
            }
          },
          "expenses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimesheetSubmissionExpense"
            }
          }
        },
        "additionalProperties": false
      },
      "TimesheetRejectionInput": {
        "type": "object",
        "required": [
          "reason"
        ],
        "properties": {
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "pattern": "\\S"
          }
        },
        "additionalProperties": false
      },
      "TimesheetWithdrawalInput": {
        "type": "object",
        "required": [
          "reason"
        ],
        "properties": {
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "pattern": "\\S"
          }
        },
        "additionalProperties": false
      },
      "TimesheetBulkApprovalInput": {
        "type": "object",
        "required": [
          "submissions"
        ],
        "properties": {
          "submissions": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "items": {
              "type": "object",
              "required": [
                "id",
                "expected_version"
              ],
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1
                },
                "expected_version": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "TimesheetBulkApprovalResult": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimesheetSubmission"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimesheetSubmission"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionDetailEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimesheetSubmissionDetail"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetSubmissionPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimesheetSubmission"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "TimesheetDeadline": {
        "type": "object",
        "required": [
          "day",
          "time"
        ],
        "properties": {
          "day": {
            "type": "string",
            "enum": [
              "sunday",
              "monday",
              "tuesday",
              "wednesday",
              "thursday",
              "friday",
              "saturday"
            ]
          },
          "time": {
            "type": "string",
            "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockPolicy": {
        "type": "object",
        "required": [
          "auto_lock",
          "timesheet_deadline",
          "timezone",
          "week_start_day",
          "updated_at"
        ],
        "properties": {
          "auto_lock": {
            "type": "boolean"
          },
          "timesheet_deadline": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TimesheetDeadline"
              },
              {
                "type": "null"
              }
            ]
          },
          "timezone": {
            "type": "string"
          },
          "week_start_day": {
            "type": "string",
            "enum": [
              "saturday",
              "sunday",
              "monday"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockPolicyPatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "auto_lock": {
            "type": "boolean"
          },
          "timesheet_deadline": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TimesheetDeadline"
              },
              {
                "type": "null"
              }
            ]
          },
          "timezone": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockPolicyEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimesheetLockPolicy"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockWindow": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "period_start",
          "period_end",
          "reason",
          "locked_by_user_id",
          "locked_at",
          "unlocked_by_user_id",
          "unlocked_at",
          "unlock_reason",
          "active"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "kind": {
            "type": "string",
            "enum": [
              "manual",
              "auto"
            ]
          },
          "period_start": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "period_end": {
            "type": "string",
            "format": "date"
          },
          "reason": {
            "type": "string"
          },
          "locked_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "locked_at": {
            "type": "string",
            "format": "date-time"
          },
          "unlocked_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "unlocked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "unlock_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "active": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TimesheetManualLockInput": {
        "type": "object",
        "required": [
          "locked_through",
          "reason"
        ],
        "properties": {
          "locked_through": {
            "type": "string",
            "format": "date"
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "pattern": "\\S"
          }
        },
        "additionalProperties": false
      },
      "TimesheetUnlockInput": {
        "type": "object",
        "required": [
          "reason"
        ],
        "properties": {
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "pattern": "\\S"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockWindowEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimesheetLockWindow"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimesheetLockWindowPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimesheetLockWindow"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "Expense": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "project_id",
          "expense_category_id",
          "spent_date",
          "total_cost_cents",
          "billable",
          "approval_status",
          "is_locked",
          "reimbursable",
          "reimbursement_status",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "expense_category_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "units": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "total_cost_cents": {
            "type": "integer",
            "minimum": -9000000000000,
            "maximum": 9000000000000
          },
          "billable": {
            "type": "boolean"
          },
          "approval_status": {
            "type": "string",
            "enum": [
              "unsubmitted",
              "submitted",
              "approved"
            ]
          },
          "source_approval_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "unsubmitted",
                  "submitted",
                  "approved"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ],
            "description": "Omitted without invoices:read authority (profile and token)."
          },
          "is_billed": {
            "type": "boolean",
            "description": "Omitted without invoices:read authority (profile and token)."
          },
          "is_locked": {
            "type": "boolean"
          },
          "locked_reason_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "locked_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "reimbursable": {
            "type": "boolean"
          },
          "reimbursement_status": {
            "type": "string",
            "enum": [
              "none",
              "pending",
              "approved",
              "paid"
            ]
          },
          "payout_ref": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ExpenseInput": {
        "type": "object",
        "required": [
          "project_id",
          "expense_category_id",
          "spent_date"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "expense_category_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "units": {
            "type": "number",
            "minimum": 0
          },
          "total_cost_cents": {
            "type": "integer",
            "minimum": 0
          },
          "billable": {
            "type": "boolean"
          },
          "reimbursable": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ExpensePatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "expense_category_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "units": {
            "type": "number",
            "minimum": 0
          },
          "total_cost_cents": {
            "type": "integer",
            "minimum": 0
          },
          "billable": {
            "type": "boolean"
          },
          "reimbursable": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ExpenseEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Expense"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ExpensePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Expense"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "InvoiceLine": {
        "type": "object",
        "required": [
          "id",
          "invoice_id",
          "position",
          "kind",
          "description",
          "quantity",
          "unit_price_cents",
          "amount_cents",
          "taxed",
          "taxed2",
          "project_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "position": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "unit_price_cents": {
            "type": "integer"
          },
          "amount_cents": {
            "type": "integer"
          },
          "taxed": {
            "type": "boolean"
          },
          "taxed2": {
            "type": "boolean"
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Invoice": {
        "type": "object",
        "required": [
          "id",
          "client_id",
          "created_by_user_id",
          "number",
          "subject",
          "purchase_order",
          "notes",
          "currency",
          "issue_date",
          "due_date",
          "payment_terms",
          "state",
          "version",
          "close_reason",
          "close_write_off_cents",
          "sent_at",
          "paid_at",
          "paid_date",
          "closed_at",
          "period_start",
          "period_end",
          "project_id",
          "retainer_id",
          "recurring_invoice_id",
          "estimate_id",
          "reminder_policy",
          "tax_rate_ppm",
          "tax2_rate_ppm",
          "discount_rate_ppm",
          "amount_cents",
          "due_amount_cents",
          "tax_amount_cents",
          "tax2_amount_cents",
          "discount_amount_cents",
          "written_off_cents",
          "payment_options",
          "reference_token",
          "created_at",
          "updated_at",
          "line_items"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "number": {
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "purchase_order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "due_date": {
            "type": "string",
            "format": "date"
          },
          "payment_terms": {
            "type": "string",
            "enum": [
              "upon_receipt",
              "net_15",
              "net_30",
              "net_45",
              "net_60",
              "custom"
            ]
          },
          "state": {
            "type": "string",
            "enum": [
              "draft",
              "open",
              "paid",
              "closed"
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "close_reason": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "cancelled",
                  "written_off",
                  "source_closed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "close_write_off_cents": {
            "type": "integer",
            "minimum": 0
          },
          "sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "paid_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "paid_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "closed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "period_start": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "period_end": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "retainer_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "recurring_invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "estimate_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "reminder_policy": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InvoiceReminderPolicy"
              },
              {
                "type": "null"
              }
            ]
          },
          "tax_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "tax2_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "discount_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "amount_cents": {
            "type": "integer"
          },
          "due_amount_cents": {
            "type": "integer",
            "minimum": 0
          },
          "tax_amount_cents": {
            "type": "integer"
          },
          "tax2_amount_cents": {
            "type": "integer"
          },
          "discount_amount_cents": {
            "type": "integer"
          },
          "written_off_cents": {
            "type": "integer",
            "minimum": 0
          },
          "payment_options": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "stripe_checkout",
                "paypal_checkout",
                "quickbooks_checkout",
                "mercury_transfer",
                "wise_transfer"
              ]
            }
          },
          "reference_token": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "line_items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceLine"
            }
          }
        },
        "additionalProperties": false
      },
      "InvoiceEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Invoice"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoicePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Invoice"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "EstimateLine": {
        "type": "object",
        "required": [
          "id",
          "estimate_id",
          "position",
          "kind",
          "description",
          "quantity",
          "unit_price_cents",
          "amount_cents",
          "taxed",
          "taxed2",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "estimate_id": {
            "type": "integer",
            "minimum": 1
          },
          "position": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "unit_price_cents": {
            "type": "integer"
          },
          "amount_cents": {
            "type": "integer"
          },
          "taxed": {
            "type": "boolean"
          },
          "taxed2": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Estimate": {
        "type": "object",
        "required": [
          "id",
          "client_id",
          "created_by_user_id",
          "number",
          "purchase_order",
          "subject",
          "notes",
          "currency",
          "state",
          "version",
          "issue_date",
          "sent_at",
          "accepted_at",
          "declined_at",
          "tax_rate_ppm",
          "tax2_rate_ppm",
          "discount_rate_ppm",
          "amount_cents",
          "tax_amount_cents",
          "tax2_amount_cents",
          "discount_amount_cents",
          "created_at",
          "updated_at",
          "line_items"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "number": {
            "type": "string"
          },
          "purchase_order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "state": {
            "type": "string",
            "enum": [
              "draft",
              "sent",
              "accepted",
              "declined"
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "accepted_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "declined_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "tax_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "tax2_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "discount_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "amount_cents": {
            "type": "integer"
          },
          "tax_amount_cents": {
            "type": "integer"
          },
          "tax2_amount_cents": {
            "type": "integer"
          },
          "discount_amount_cents": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "line_items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EstimateLine"
            }
          }
        },
        "additionalProperties": false
      },
      "EstimateEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Estimate"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EstimatePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Estimate"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "EstimateMessage": {
        "type": "object",
        "required": [
          "id",
          "estimate_id",
          "sent_by",
          "sent_by_email",
          "sent_from",
          "sent_from_email",
          "recipients",
          "subject",
          "body",
          "send_me_a_copy",
          "event_type",
          "delivery_status",
          "provider_message_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "estimate_id": {
            "type": "integer",
            "minimum": 1
          },
          "sent_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_by_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_from": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_from_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceRecipient"
            }
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "send_me_a_copy": {
            "type": "boolean"
          },
          "event_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "send",
                  "accept",
                  "decline",
                  "re-open",
                  "view",
                  "invoice"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "delivery_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "queued",
                  "sent",
                  "bounced",
                  "complained",
                  "failed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_message_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "EstimateMessageListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EstimateMessage"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EstimateMessageInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "expected_version",
              "event_type",
              "recipients"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "event_type": {
                "const": "send"
              },
              "recipients": {
                "type": "array",
                "minItems": 1,
                "maxItems": 1000,
                "items": {
                  "$ref": "#/components/schemas/InvoiceRecipient"
                }
              },
              "subject": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "body": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "send_me_a_copy": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "expected_version",
              "event_type"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "event_type": {
                "type": "string",
                "enum": [
                  "accept",
                  "decline",
                  "re-open"
                ]
              },
              "recipients": {
                "type": "array",
                "maxItems": 1000,
                "items": {
                  "$ref": "#/components/schemas/InvoiceRecipient"
                }
              },
              "subject": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "body": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "send_me_a_copy": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "EstimateMessageCommandResponse": {
        "type": "object",
        "required": [
          "estimate",
          "message"
        ],
        "properties": {
          "estimate": {
            "$ref": "#/components/schemas/Estimate"
          },
          "message": {
            "$ref": "#/components/schemas/EstimateMessage"
          }
        },
        "additionalProperties": false
      },
      "EstimateMessageCommandEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EstimateMessageCommandResponse"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "EstimateConversionInput": {
        "type": "object",
        "required": [
          "expected_version",
          "number",
          "issue_date",
          "due_date",
          "payment_terms"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "number": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "pattern": "\\S"
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "due_date": {
            "type": "string",
            "format": "date"
          },
          "payment_terms": {
            "type": "string",
            "enum": [
              "upon_receipt",
              "net_15",
              "net_30",
              "net_45",
              "net_60",
              "custom"
            ]
          }
        },
        "additionalProperties": false
      },
      "EstimateConversion": {
        "type": "object",
        "required": [
          "invoice",
          "event"
        ],
        "properties": {
          "invoice": {
            "$ref": "#/components/schemas/Invoice"
          },
          "event": {
            "$ref": "#/components/schemas/EstimateMessage"
          }
        },
        "additionalProperties": false
      },
      "EstimateConversionEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EstimateConversion"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoiceGenerationInput": {
        "type": "object",
        "required": [
          "client_id",
          "from",
          "to",
          "project_ids",
          "time_summary_type",
          "expense_summary_type"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "project_ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10000,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "time_summary_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "project",
                  "task",
                  "people",
                  "detailed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "expense_summary_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "project",
                  "category",
                  "people",
                  "detailed"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceCommandSnapshot": {
        "type": "object",
        "required": [
          "id",
          "version",
          "updated_at",
          "state",
          "close_reason",
          "close_write_off_cents",
          "sent_at",
          "paid_at",
          "paid_date",
          "closed_at",
          "amount_cents",
          "due_amount_cents",
          "written_off_cents",
          "payment_count",
          "payment_status"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "state": {
            "type": "string",
            "enum": [
              "draft",
              "open",
              "paid",
              "closed"
            ]
          },
          "close_reason": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "cancelled",
                  "written_off",
                  "source_closed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "close_write_off_cents": {
            "type": "integer",
            "minimum": 0
          },
          "sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "paid_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "paid_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "closed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "amount_cents": {
            "type": "integer"
          },
          "due_amount_cents": {
            "type": "integer",
            "minimum": 0
          },
          "written_off_cents": {
            "type": "integer",
            "minimum": 0
          },
          "payment_count": {
            "type": "integer",
            "minimum": 0
          },
          "payment_status": {
            "type": "string",
            "enum": [
              "unpaid",
              "partial",
              "paid"
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceCommandResult": {
        "type": "object",
        "required": [
          "schema_version",
          "event_ids",
          "first_aggregate_sequence",
          "event_count",
          "invoice"
        ],
        "properties": {
          "schema_version": {
            "const": 1
          },
          "event_ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 2,
            "items": {
              "type": "string"
            }
          },
          "first_aggregate_sequence": {
            "type": "integer",
            "minimum": 1
          },
          "event_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2
          },
          "invoice": {
            "$ref": "#/components/schemas/InvoiceCommandSnapshot"
          }
        },
        "additionalProperties": false
      },
      "InvoiceCommandResponse": {
        "type": "object",
        "required": [
          "invoice",
          "command"
        ],
        "properties": {
          "invoice": {
            "$ref": "#/components/schemas/Invoice"
          },
          "command": {
            "$ref": "#/components/schemas/InvoiceCommandResult"
          }
        },
        "additionalProperties": false
      },
      "InvoiceCommandEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/InvoiceCommandResponse"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoiceEditInput": {
        "type": "object",
        "required": [
          "expected_version"
        ],
        "minProperties": 2,
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "number": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "purchase_order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "due_date": {
            "type": "string",
            "format": "date"
          },
          "payment_terms": {
            "type": "string",
            "enum": [
              "upon_receipt",
              "net_15",
              "net_30",
              "net_45",
              "net_60",
              "custom"
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "retainer_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "reminder_policy": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InvoiceReminderPolicy"
              },
              {
                "type": "null"
              }
            ]
          },
          "payment_options": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "stripe_checkout",
                "paypal_checkout",
                "quickbooks_checkout",
                "mercury_transfer",
                "wise_transfer"
              ]
            }
          },
          "tax_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "tax2_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          },
          "discount_rate_ppm": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceLineInput": {
        "type": "object",
        "required": [
          "expected_version",
          "position",
          "kind",
          "quantity",
          "unit_price_cents"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "position": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "unit_price_cents": {
            "type": "integer",
            "minimum": -9000000000000,
            "maximum": 9000000000000
          },
          "taxed": {
            "type": "boolean"
          },
          "taxed2": {
            "type": "boolean"
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceLineUpdateInput": {
        "type": "object",
        "required": [
          "expected_version",
          "expected_updated_at",
          "position",
          "kind",
          "quantity",
          "unit_price_cents"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "position": {
            "type": "integer",
            "minimum": 0
          },
          "kind": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "unit_price_cents": {
            "type": "integer",
            "minimum": -9000000000000,
            "maximum": 9000000000000
          },
          "taxed": {
            "type": "boolean"
          },
          "taxed2": {
            "type": "boolean"
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "VersionedRowDeleteInput": {
        "type": "object",
        "required": [
          "expected_version",
          "expected_updated_at"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "InvoiceRecipient": {
        "type": "object",
        "required": [
          "name",
          "email"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 1000
          },
          "email": {
            "type": "string",
            "minLength": 3,
            "maxLength": 320
          }
        },
        "additionalProperties": false
      },
      "InvoiceMessage": {
        "type": "object",
        "required": [
          "id",
          "invoice_id",
          "sent_by",
          "sent_by_email",
          "sent_from",
          "sent_from_email",
          "recipients",
          "subject",
          "body",
          "attach_pdf",
          "send_me_a_copy",
          "thank_you",
          "reminder",
          "send_reminder_on",
          "event_type",
          "delivery_status",
          "provider_message_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "sent_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_by_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_from": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_from_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceRecipient"
            }
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attach_pdf": {
            "type": "boolean"
          },
          "send_me_a_copy": {
            "type": "boolean"
          },
          "thank_you": {
            "type": "boolean"
          },
          "reminder": {
            "type": "boolean"
          },
          "send_reminder_on": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "event_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "delivery_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_message_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "InvoiceMessageListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceMessage"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoiceMessageInput": {
        "type": "object",
        "required": [
          "event_type",
          "expected_version"
        ],
        "properties": {
          "event_type": {
            "type": "string",
            "enum": [
              "send",
              "draft",
              "cancel",
              "write_off",
              "reopen",
              "re-open"
            ]
          },
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "recipients": {
            "type": "array",
            "maxItems": 1000,
            "items": {
              "$ref": "#/components/schemas/InvoiceRecipient"
            }
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attach_pdf": {
            "type": "boolean"
          },
          "send_me_a_copy": {
            "type": "boolean"
          },
          "thank_you": {
            "type": "boolean"
          },
          "reminder": {
            "type": "boolean"
          },
          "send_reminder_on": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceTransitionInput": {
        "type": "object",
        "required": [
          "command",
          "expected_version"
        ],
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "send",
              "draft",
              "cancel",
              "write_off",
              "reopen",
              "re-open"
            ]
          },
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "recipients": {
            "type": "array",
            "maxItems": 1000,
            "items": {
              "$ref": "#/components/schemas/InvoiceRecipient"
            }
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attach_pdf": {
            "type": "boolean"
          },
          "send_me_a_copy": {
            "type": "boolean"
          },
          "thank_you": {
            "type": "boolean"
          },
          "reminder": {
            "type": "boolean"
          },
          "send_reminder_on": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoiceEmailDeliveryInput": {
        "type": "object",
        "required": [
          "expected_version",
          "recipients",
          "confirmed"
        ],
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "recipients": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "$ref": "#/components/schemas/InvoiceRecipient"
            }
          },
          "sender_identity_id": {
            "type": "integer",
            "minimum": 1
          },
          "template_version": {
            "type": "integer",
            "minimum": 1
          },
          "confirmed": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": false
      },
      "InvoicePayment": {
        "type": "object",
        "required": [
          "id",
          "invoice_id",
          "currency",
          "amount_cents",
          "paid_at",
          "paid_date",
          "notes",
          "recorded_by_user_id",
          "provider",
          "provider_shape",
          "provider_account_id",
          "provider_transaction_id",
          "bank_deposit_id",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "amount_cents": {
            "type": "integer",
            "minimum": 1
          },
          "paid_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "paid_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "recorded_by_user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "provider": {
            "type": "string"
          },
          "provider_shape": {
            "type": "string"
          },
          "provider_account_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "provider_transaction_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "bank_deposit_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "InvoicePaymentListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoicePayment"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoicePaymentInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "expected_version",
              "amount_cents",
              "currency",
              "paid_at"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "currency": {
                "type": "string",
                "pattern": "^[A-Z]{3}$"
              },
              "paid_at": {
                "type": "string",
                "format": "date-time"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "expected_version",
              "amount_cents",
              "currency",
              "paid_date"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "currency": {
                "type": "string",
                "pattern": "^[A-Z]{3}$"
              },
              "paid_date": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "InvoicePaymentUpdateInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "expected_version",
              "expected_updated_at",
              "amount_cents",
              "paid_at"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "expected_updated_at": {
                "type": "string",
                "format": "date-time"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "paid_at": {
                "type": "string",
                "format": "date-time"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "expected_version",
              "expected_updated_at",
              "amount_cents",
              "paid_date"
            ],
            "properties": {
              "expected_version": {
                "type": "integer",
                "minimum": 0
              },
              "expected_updated_at": {
                "type": "string",
                "format": "date-time"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "paid_date": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "Retainer": {
        "type": "object",
        "required": [
          "id",
          "client_id",
          "project_id",
          "state",
          "denomination",
          "amount_cents",
          "seconds",
          "locked_rate_cents",
          "rate_locked_at",
          "period",
          "rollover",
          "expires_at",
          "on_exhaustion",
          "balance",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "state": {
            "type": "string",
            "enum": [
              "ongoing",
              "closed"
            ]
          },
          "denomination": {
            "type": "string",
            "enum": [
              "money",
              "hours"
            ]
          },
          "amount_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "locked_rate_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "rate_locked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "rollover": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "carry",
                  "expire",
                  "cap"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "on_exhaustion": {
            "type": "string",
            "enum": [
              "block",
              "warn",
              "overflow"
            ]
          },
          "balance": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RetainerEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Retainer"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "RetainerPage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Retainer"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "RetainerInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "denomination",
              "amount_cents"
            ],
            "properties": {
              "client_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "denomination": {
                "const": "money"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9000000000000
              },
              "period": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "rollover": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "carry",
                      "expire",
                      "cap"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "expires_at": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "on_exhaustion": {
                "type": "string",
                "enum": [
                  "block",
                  "warn",
                  "overflow"
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "denomination",
              "seconds"
            ],
            "properties": {
              "client_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "denomination": {
                "const": "hours"
              },
              "seconds": {
                "type": "integer",
                "minimum": 0
              },
              "period": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "rollover": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "carry",
                      "expire",
                      "cap"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "expires_at": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "on_exhaustion": {
                "type": "string",
                "enum": [
                  "block",
                  "warn",
                  "overflow"
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "denomination",
              "seconds",
              "locked_rate_cents",
              "rate_locked_at"
            ],
            "properties": {
              "client_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "project_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "denomination": {
                "const": "hours"
              },
              "seconds": {
                "type": "integer",
                "minimum": 0
              },
              "locked_rate_cents": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9000000000000
              },
              "rate_locked_at": {
                "type": "string",
                "format": "date-time"
              },
              "period": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "rollover": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "carry",
                      "expire",
                      "cap"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "expires_at": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "on_exhaustion": {
                "type": "string",
                "enum": [
                  "block",
                  "warn",
                  "overflow"
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "RetainerPatch": {
        "type": "object",
        "minProperties": 1,
        "properties": {
          "state": {
            "type": "string",
            "enum": [
              "ongoing",
              "closed"
            ]
          },
          "period": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ]
          },
          "rollover": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "carry",
                  "expire",
                  "cap"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "on_exhaustion": {
            "type": "string",
            "enum": [
              "block",
              "warn",
              "overflow"
            ]
          }
        },
        "additionalProperties": false
      },
      "RetainerLedgerEntry": {
        "type": "object",
        "required": [
          "id",
          "retainer_id",
          "kind",
          "unit",
          "amount",
          "invoice_id",
          "occurred_on",
          "notes",
          "created_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "retainer_id": {
            "type": "integer",
            "minimum": 1
          },
          "kind": {
            "type": "string",
            "enum": [
              "deposit",
              "drawdown",
              "expiry",
              "reset",
              "adjustment"
            ]
          },
          "unit": {
            "type": "string",
            "enum": [
              "cents",
              "seconds"
            ]
          },
          "amount": {
            "type": "integer"
          },
          "invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "occurred_on": {
            "type": "string",
            "format": "date"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RetainerLedgerListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RetainerLedgerEntry"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "RetainerLedgerMutation": {
        "type": "object",
        "required": [
          "entry",
          "balance",
          "denomination"
        ],
        "properties": {
          "entry": {
            "$ref": "#/components/schemas/RetainerLedgerEntry"
          },
          "balance": {
            "type": "integer"
          },
          "denomination": {
            "type": "string",
            "enum": [
              "money",
              "hours"
            ]
          }
        },
        "additionalProperties": false
      },
      "RetainerLedgerMutationEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RetainerLedgerMutation"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "RetainerLedgerInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "kind",
              "amount_cents",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "kind": {
                "const": "deposit"
              },
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "seconds",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "kind": {
                "const": "deposit"
              },
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "seconds": {
                "type": "integer",
                "minimum": 1
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "amount_cents",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "kind": {
                "const": "drawdown"
              },
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "seconds",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "kind": {
                "const": "drawdown"
              },
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "seconds": {
                "type": "integer",
                "minimum": 1
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "amount_cents",
              "occurred_on"
            ],
            "properties": {
              "kind": {
                "const": "expiry"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "seconds",
              "occurred_on"
            ],
            "properties": {
              "kind": {
                "const": "expiry"
              },
              "seconds": {
                "type": "integer",
                "minimum": 1
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "amount_cents",
              "occurred_on"
            ],
            "properties": {
              "kind": {
                "const": "reset"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9000000000000,
                "maximum": 9000000000000,
                "not": {
                  "const": 0
                }
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "seconds",
              "occurred_on"
            ],
            "properties": {
              "kind": {
                "const": "reset"
              },
              "seconds": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "not": {
                  "const": 0
                }
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "amount_cents",
              "occurred_on",
              "notes"
            ],
            "properties": {
              "kind": {
                "const": "adjustment"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9000000000000,
                "maximum": 9000000000000,
                "not": {
                  "const": 0
                }
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "kind",
              "seconds",
              "occurred_on",
              "notes"
            ],
            "properties": {
              "kind": {
                "const": "adjustment"
              },
              "seconds": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "not": {
                  "const": 0
                }
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "RetainerDrawdownInput": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "amount_cents",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "amount_cents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9000000000000
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "seconds",
              "occurred_on",
              "invoice_id"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "seconds": {
                "type": "integer",
                "minimum": 1
              },
              "occurred_on": {
                "type": "string",
                "format": "date"
              },
              "notes": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "RecurringFixedLine": {
        "type": "object",
        "required": [
          "kind",
          "description",
          "quantity",
          "unit_price_cents",
          "taxed",
          "taxed2",
          "project_id"
        ],
        "properties": {
          "kind": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "unit_price_cents": {
            "type": "integer"
          },
          "taxed": {
            "type": "boolean"
          },
          "taxed2": {
            "type": "boolean"
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "through": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "installments": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "RecurringAmountConfig": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "schema_version",
              "type",
              "line_items"
            ],
            "properties": {
              "schema_version": {
                "const": 1
              },
              "type": {
                "const": "fixed_lines"
              },
              "line_items": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/RecurringFixedLine"
                }
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "schema_version",
              "type",
              "project_ids",
              "time"
            ],
            "properties": {
              "schema_version": {
                "const": 1
              },
              "type": {
                "const": "line_items_import"
              },
              "project_ids": {
                "type": "array",
                "minItems": 1,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "time": {
                "type": "object",
                "required": [
                  "summary_type"
                ],
                "properties": {
                  "summary_type": {
                    "type": "string",
                    "enum": [
                      "project",
                      "task",
                      "people",
                      "detailed"
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "schema_version",
              "type",
              "project_ids",
              "expenses"
            ],
            "properties": {
              "schema_version": {
                "const": 1
              },
              "type": {
                "const": "line_items_import"
              },
              "project_ids": {
                "type": "array",
                "minItems": 1,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "expenses": {
                "type": "object",
                "required": [
                  "summary_type"
                ],
                "properties": {
                  "summary_type": {
                    "type": "string",
                    "enum": [
                      "project",
                      "category",
                      "people",
                      "detailed"
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "schema_version",
              "type",
              "project_ids",
              "time",
              "expenses"
            ],
            "properties": {
              "schema_version": {
                "const": 1
              },
              "type": {
                "const": "line_items_import"
              },
              "project_ids": {
                "type": "array",
                "minItems": 1,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "time": {
                "type": "object",
                "required": [
                  "summary_type"
                ],
                "properties": {
                  "summary_type": {
                    "type": "string",
                    "enum": [
                      "project",
                      "task",
                      "people",
                      "detailed"
                    ]
                  }
                },
                "additionalProperties": false
              },
              "expenses": {
                "type": "object",
                "required": [
                  "summary_type"
                ],
                "properties": {
                  "summary_type": {
                    "type": "string",
                    "enum": [
                      "project",
                      "category",
                      "people",
                      "detailed"
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "RecurringInvoice": {
        "type": "object",
        "required": [
          "id",
          "client_id",
          "subject_template",
          "notes_template",
          "every_n_months",
          "day_of_month",
          "next_issue_on",
          "amount_config",
          "can_draw_from_retainer_id",
          "claims_project_ids",
          "claim_mode",
          "claim_ceiling_seconds",
          "claim_ceiling_cents",
          "claim_scope",
          "cost_alert_basis_points",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "subject_template": {
            "type": "string"
          },
          "notes_template": {
            "type": "string"
          },
          "every_n_months": {
            "type": "integer",
            "minimum": 1
          },
          "day_of_month": {
            "type": "integer",
            "minimum": 1,
            "maximum": 31
          },
          "next_issue_on": {
            "type": "string",
            "format": "date"
          },
          "amount_config": {
            "$ref": "#/components/schemas/RecurringAmountConfig"
          },
          "can_draw_from_retainer_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claims_project_ids": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_mode": {
            "type": "string",
            "enum": [
              "all",
              "ceiling"
            ]
          },
          "claim_ceiling_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_ceiling_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_scope": {
            "type": "string",
            "enum": [
              "billable",
              "tracked"
            ]
          },
          "cost_alert_basis_points": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 20000
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RecurringInvoiceEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RecurringInvoice"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "RecurringGeneration": {
        "type": "object",
        "required": [
          "definition_id",
          "period",
          "next_issue_on",
          "retainer_drawdown_cents"
        ],
        "properties": {
          "definition_id": {
            "type": "integer",
            "minimum": 1
          },
          "period": {
            "type": "string"
          },
          "next_issue_on": {
            "type": "string"
          },
          "retainer_drawdown_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "RecurringGenerationEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "invoice",
              "generation"
            ],
            "properties": {
              "invoice": {
                "$ref": "#/components/schemas/Invoice"
              },
              "generation": {
                "$ref": "#/components/schemas/RecurringGeneration"
              }
            },
            "additionalProperties": false
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "RecurringInvoicePage": {
        "type": "object",
        "required": [
          "data",
          "links",
          "page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecurringInvoice"
            }
          },
          "links": {
            "$ref": "#/components/schemas/PageLinks"
          },
          "page": {
            "$ref": "#/components/schemas/PageMetadata"
          }
        },
        "additionalProperties": false
      },
      "BandClaimBackfillInput": {
        "type": "object",
        "required": [
          "invoice_ids"
        ],
        "properties": {
          "invoice_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            },
            "minItems": 1
          },
          "project_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "apply": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "BandClaimBackfillLine": {
        "type": "object",
        "required": [
          "invoice_id",
          "number",
          "issue_date",
          "state",
          "amount_cents",
          "entry_count",
          "seconds",
          "billable_value_cents",
          "entries_without_billable_rate",
          "foregone_billable_cents"
        ],
        "properties": {
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "number": {
            "type": "string"
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "state": {
            "type": "string"
          },
          "amount_cents": {
            "type": "integer"
          },
          "entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "seconds": {
            "type": "integer"
          },
          "billable_value_cents": {
            "type": "integer"
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "foregone_billable_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "BandClaimBackfill": {
        "type": "object",
        "required": [
          "run_id",
          "applied",
          "invoices",
          "remaining_entry_count",
          "remaining_seconds"
        ],
        "properties": {
          "run_id": {
            "type": "string"
          },
          "applied": {
            "type": "boolean"
          },
          "invoices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BandClaimBackfillLine"
            }
          },
          "remaining_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "remaining_seconds": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "BandClaimBackfillEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BandClaimBackfill"
          }
        },
        "additionalProperties": false
      },
      "RecurringInvoiceInput": {
        "type": "object",
        "required": [
          "client_id",
          "subject_template",
          "notes_template",
          "every_n_months",
          "day_of_month",
          "next_issue_on",
          "amount_config"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "subject_template": {
            "type": "string",
            "minLength": 1
          },
          "notes_template": {
            "type": "string"
          },
          "every_n_months": {
            "type": "integer",
            "minimum": 1
          },
          "day_of_month": {
            "type": "integer",
            "minimum": 1,
            "maximum": 31
          },
          "next_issue_on": {
            "type": "string",
            "format": "date"
          },
          "amount_config": {
            "$ref": "#/components/schemas/RecurringAmountConfig"
          },
          "can_draw_from_retainer_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claims_project_ids": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_mode": {
            "type": "string",
            "enum": [
              "all",
              "ceiling"
            ]
          },
          "claim_ceiling_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_ceiling_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "claim_scope": {
            "type": "string",
            "enum": [
              "billable",
              "tracked"
            ]
          },
          "cost_alert_basis_points": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 20000
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "MyHoursProject": {
        "type": "object",
        "required": [
          "project_id",
          "project_name",
          "project_code",
          "client_id",
          "client_name",
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "MyHoursReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "user_id",
          "project_id",
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "projects"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MyHoursProject"
            }
          }
        },
        "additionalProperties": false
      },
      "MyHoursReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MyHoursReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "DetailedTimeRow": {
        "type": "object",
        "required": [
          "spent_date",
          "client_id",
          "client_name",
          "project_id",
          "project_name",
          "project_code",
          "task_id",
          "task_name",
          "user_id",
          "user_name",
          "roles",
          "currency",
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "uninvoiced_billable_seconds",
          "time_entry_count",
          "entries_without_billable_rate",
          "claimed"
        ],
        "properties": {
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_name": {
            "type": "string"
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_name": {
            "type": "string"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "type": "string"
          },
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "uninvoiced_billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "billable_amount_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "claimed": {
            "type": "boolean"
          },
          "time_entry_id": {
            "type": "integer",
            "minimum": 1
          },
          "invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "project_active": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "DetailedTimeCurrencyTotal": {
        "type": "object",
        "required": [
          "currency",
          "entries_without_billable_rate"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "billable_amount_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "DetailedTimeReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "client_id",
          "project_id",
          "task_id",
          "user_id",
          "role_id",
          "tag_id",
          "invoice_state",
          "hours",
          "grain",
          "active_projects_only",
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "uninvoiced_billable_seconds",
          "claimed_seconds",
          "unclaimed_seconds",
          "time_entry_count",
          "currencies",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "task_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "role_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "tag_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "invoice_state": {
            "type": "string",
            "enum": [
              "all",
              "invoiced",
              "uninvoiced"
            ]
          },
          "hours": {
            "type": "string",
            "enum": [
              "all",
              "billable",
              "non_billable",
              "uninvoiced",
              "claimed",
              "unclaimed"
            ]
          },
          "grain": {
            "type": "string",
            "enum": [
              "day",
              "entry"
            ]
          },
          "active_projects_only": {
            "type": "boolean"
          },
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "uninvoiced_billable_seconds": {
            "type": "integer"
          },
          "claimed_seconds": {
            "type": "integer"
          },
          "unclaimed_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "currencies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DetailedTimeCurrencyTotal"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DetailedTimeRow"
            }
          }
        },
        "additionalProperties": false
      },
      "DetailedTimeReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DetailedTimeReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ReportTimeActionInput": {
        "type": "object",
        "required": [
          "command_id",
          "action",
          "entry_ids",
          "confirmed"
        ],
        "properties": {
          "command_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "pattern": "^[A-Za-z0-9_-]+$"
          },
          "action": {
            "type": "string",
            "enum": [
              "mark_invoiced",
              "mark_uninvoiced",
              "move"
            ]
          },
          "entry_ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "confirmed": {
            "const": true
          },
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          }
        },
        "additionalProperties": false
      },
      "ReportTimeAction": {
        "type": "object",
        "required": [
          "command_id",
          "action",
          "requested",
          "changed_entry_ids",
          "ineligible_entry_ids",
          "replayed"
        ],
        "properties": {
          "command_id": {
            "type": "string"
          },
          "action": {
            "type": "string",
            "enum": [
              "mark_invoiced",
              "mark_uninvoiced",
              "move"
            ]
          },
          "requested": {
            "type": "integer",
            "minimum": 1
          },
          "changed_entry_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "ineligible_entry_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "replayed": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ReportTimeActionEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ReportTimeAction"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TimeReportAmount": {
        "type": "object",
        "required": [
          "currency",
          "billable_cents",
          "uninvoiced_cents"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "billable_cents": {
            "type": "integer"
          },
          "uninvoiced_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "TimeReportTotals": {
        "type": "object",
        "required": [
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "unpriced_billable_entry_count"
        ],
        "properties": {
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportAmount"
            }
          }
        },
        "additionalProperties": false
      },
      "TimeReportClientRow": {
        "type": "object",
        "required": [
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "unpriced_billable_entry_count",
          "client_id",
          "client_name"
        ],
        "properties": {
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportAmount"
            }
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TimeReportProjectRow": {
        "type": "object",
        "required": [
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "unpriced_billable_entry_count",
          "project_id",
          "project_name",
          "project_code",
          "client_id",
          "client_name"
        ],
        "properties": {
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportAmount"
            }
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TimeReportTaskRow": {
        "type": "object",
        "required": [
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "unpriced_billable_entry_count",
          "task_id",
          "task_name"
        ],
        "properties": {
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportAmount"
            }
          },
          "task_id": {
            "type": "integer",
            "minimum": 1
          },
          "task_name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TimeReportTeammateRow": {
        "type": "object",
        "required": [
          "seconds",
          "rounded_seconds",
          "billable_seconds",
          "time_entry_count",
          "unpriced_billable_entry_count",
          "user_id",
          "user_name",
          "is_contractor",
          "capacity_seconds",
          "utilization_ppm"
        ],
        "properties": {
          "seconds": {
            "type": "integer"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportAmount"
            }
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_name": {
            "type": "string"
          },
          "is_contractor": {
            "type": "boolean"
          },
          "capacity_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "utilization_ppm": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "TimeReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "fixed_fee_included",
          "totals",
          "clients",
          "projects",
          "tasks",
          "teammates"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "fixed_fee_included": {
            "type": "boolean"
          },
          "totals": {
            "$ref": "#/components/schemas/TimeReportTotals"
          },
          "clients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportClientRow"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportProjectRow"
            }
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportTaskRow"
            }
          },
          "teammates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeReportTeammateRow"
            }
          }
        },
        "additionalProperties": false
      },
      "TimeReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TimeReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "UninvoicedCurrencyTotal": {
        "type": "object",
        "required": [
          "currency",
          "rounded_seconds",
          "time_entry_count",
          "unpriced_time_entry_count",
          "expense_count"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "expense_count": {
            "type": "integer",
            "minimum": 0
          },
          "time_cents": {
            "type": "integer"
          },
          "expense_cents": {
            "type": "integer",
            "minimum": 0
          },
          "total_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "UninvoicedProjectRow": {
        "type": "object",
        "required": [
          "client_id",
          "client_name",
          "project_id",
          "project_name",
          "project_code",
          "totals"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UninvoicedCurrencyTotal"
            }
          }
        },
        "additionalProperties": false
      },
      "UninvoicedReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "client_id",
          "project_id",
          "totals",
          "projects"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UninvoicedCurrencyTotal"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UninvoicedProjectRow"
            }
          }
        },
        "additionalProperties": false
      },
      "UninvoicedReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/UninvoicedReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ContractorCostRow": {
        "type": "object",
        "required": [
          "user_id",
          "name",
          "payroll_email",
          "is_contractor",
          "currency",
          "rounded_seconds",
          "utilization_ppm",
          "cost_cents",
          "cost_rate_cents",
          "cost_rate_is_mixed",
          "entry_count",
          "entries_without_rate"
        ],
        "properties": {
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "payroll_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "is_contractor": {
            "type": "boolean"
          },
          "currency": {
            "type": "string"
          },
          "rounded_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "utilization_ppm": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_rate_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_rate_is_mixed": {
            "type": "boolean"
          },
          "entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_rate": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "ContractorCostReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string"
          },
          "to": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ContractorCostRow"
            }
          }
        },
        "additionalProperties": false
      },
      "ContractorCostReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ContractorCostReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "InvoicedReportTotal": {
        "type": "object",
        "required": [
          "currency",
          "invoice_count"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "invoice_count": {
            "type": "integer",
            "minimum": 0
          },
          "invoiced_cents": {
            "type": "integer"
          },
          "paid_cents": {
            "type": "integer"
          },
          "balance_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "InvoicedReportRow": {
        "type": "object",
        "required": [
          "invoice_id",
          "number",
          "state",
          "close_reason",
          "issue_date",
          "due_date",
          "client_id",
          "client_name",
          "subject",
          "currency"
        ],
        "properties": {
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "number": {
            "type": "string"
          },
          "state": {
            "type": "string",
            "enum": [
              "draft",
              "open",
              "paid",
              "closed"
            ]
          },
          "close_reason": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "cancelled",
                  "written_off",
                  "source_closed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "issue_date": {
            "type": "string",
            "format": "date"
          },
          "due_date": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string"
          },
          "invoiced_cents": {
            "type": "integer"
          },
          "paid_cents": {
            "type": "integer"
          },
          "balance_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "InvoicedReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "client_id",
          "status",
          "totals",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "draft",
                  "open",
                  "paid",
                  "closed"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoicedReportTotal"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoicedReportRow"
            }
          }
        },
        "additionalProperties": false
      },
      "InvoicedReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/InvoicedReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "PaymentsReceivedReportTotal": {
        "type": "object",
        "required": [
          "currency",
          "payment_count"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "payment_count": {
            "type": "integer",
            "minimum": 0
          },
          "payment_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "PaymentReceivedReportRow": {
        "type": "object",
        "required": [
          "payment_id",
          "payment_date",
          "invoice_id",
          "invoice_number",
          "client_id",
          "client_name",
          "currency",
          "provider"
        ],
        "properties": {
          "payment_id": {
            "type": "integer",
            "minimum": 1
          },
          "payment_date": {
            "type": "string",
            "format": "date"
          },
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "invoice_number": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "invoice_total_cents": {
            "type": "integer"
          },
          "payment_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "PaymentsReceivedReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "client_id",
          "totals",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentsReceivedReportTotal"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentReceivedReportRow"
            }
          }
        },
        "additionalProperties": false
      },
      "PaymentsReceivedReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PaymentsReceivedReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ReceivablesReportTotal": {
        "type": "object",
        "required": [
          "currency",
          "invoice_count"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "invoice_count": {
            "type": "integer",
            "minimum": 0
          },
          "invoiced_cents": {
            "type": "integer"
          },
          "outstanding_cents": {
            "type": "integer"
          },
          "not_due_cents": {
            "type": "integer"
          },
          "days_1_to_30_cents": {
            "type": "integer"
          },
          "days_31_to_60_cents": {
            "type": "integer"
          },
          "days_61_to_90_cents": {
            "type": "integer"
          },
          "days_90_plus_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "ReceivablesReportRow": {
        "type": "object",
        "required": [
          "client_id",
          "client_name",
          "currency",
          "invoice_count"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "invoice_count": {
            "type": "integer",
            "minimum": 0
          },
          "invoiced_cents": {
            "type": "integer"
          },
          "outstanding_cents": {
            "type": "integer"
          },
          "not_due_cents": {
            "type": "integer"
          },
          "days_1_to_30_cents": {
            "type": "integer"
          },
          "days_31_to_60_cents": {
            "type": "integer"
          },
          "days_61_to_90_cents": {
            "type": "integer"
          },
          "days_90_plus_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "ReceivablesReport": {
        "type": "object",
        "required": [
          "as_of",
          "client_id",
          "totals",
          "rows"
        ],
        "properties": {
          "as_of": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReceivablesReportTotal"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReceivablesReportRow"
            }
          }
        },
        "additionalProperties": false
      },
      "ReceivablesReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ReceivablesReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ReportDefinitionPresentation": {
        "type": "object",
        "required": [
          "result",
          "grouped",
          "include_zero_values"
        ],
        "properties": {
          "result": {
            "type": "string",
            "enum": [
              "summary",
              "detailed"
            ]
          },
          "grouped": {
            "type": "boolean"
          },
          "include_zero_values": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SavedReportInput": {
        "type": "object",
        "required": [
          "name",
          "fields",
          "metrics",
          "filters",
          "group_by",
          "presentation"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "metrics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "group_by": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "presentation": {
            "$ref": "#/components/schemas/ReportDefinitionPresentation"
          }
        },
        "additionalProperties": false
      },
      "SavedReportUpdate": {
        "type": "object",
        "required": [
          "version"
        ],
        "properties": {
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "metrics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "group_by": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "presentation": {
            "$ref": "#/components/schemas/ReportDefinitionPresentation"
          }
        },
        "additionalProperties": false
      },
      "SavedReport": {
        "type": "object",
        "required": [
          "id",
          "name",
          "version",
          "fields",
          "metrics",
          "filters",
          "group_by",
          "presentation",
          "owner",
          "is_custom",
          "pinned",
          "shared",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "metrics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "group_by": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ]
          },
          "presentation": {
            "$ref": "#/components/schemas/ReportDefinitionPresentation"
          },
          "owner": {
            "type": "object",
            "additionalProperties": true
          },
          "is_custom": {
            "type": "boolean"
          },
          "pinned": {
            "type": "boolean"
          },
          "shared": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SavedReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SavedReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "SavedReportListEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SavedReport"
            }
          }
        },
        "additionalProperties": false
      },
      "ReportRunnerResult": {
        "type": "object",
        "required": [
          "definitionId",
          "definitionVersion",
          "state",
          "rows"
        ],
        "properties": {
          "definitionId": {
            "type": "string"
          },
          "definitionVersion": {
            "type": "integer",
            "minimum": 1
          },
          "state": {
            "type": "string",
            "enum": [
              "ready",
              "empty",
              "too_many_rows"
            ]
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false
      },
      "ReportRunnerEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ReportRunnerResult"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ReportDefinitionRegistry": {
        "type": "object",
        "required": [
          "fields",
          "metrics"
        ],
        "properties": {
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "metrics": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false
      },
      "ReportDefinitionRegistryEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ReportDefinitionRegistry"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "DetailedExpenseRow": {
        "type": "object",
        "required": [
          "expense_id",
          "spent_date",
          "client_id",
          "client_name",
          "project_id",
          "project_name",
          "project_code",
          "category_id",
          "category_name",
          "user_id",
          "user_name",
          "notes",
          "units",
          "billable",
          "reimbursable",
          "invoice_id",
          "currency"
        ],
        "properties": {
          "expense_id": {
            "type": "integer",
            "minimum": 1
          },
          "spent_date": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "category_id": {
            "type": "integer",
            "minimum": 1
          },
          "category_name": {
            "type": "string"
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "user_name": {
            "type": "string"
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "units": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "billable": {
            "type": "boolean"
          },
          "reimbursable": {
            "type": "boolean"
          },
          "invoice_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string"
          },
          "total_cost_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "DetailedExpenseTotal": {
        "type": "object",
        "required": [
          "currency",
          "expense_count"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "expense_count": {
            "type": "integer",
            "minimum": 0
          },
          "total_cost_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "DetailedExpenseReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "client_id",
          "project_id",
          "category_id",
          "user_id",
          "billable",
          "reimbursable",
          "invoice_state",
          "active_projects_only",
          "totals",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "project_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "category_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "user_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "billable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "reimbursable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "invoice_state": {
            "type": "string",
            "enum": [
              "all",
              "invoiced",
              "uninvoiced"
            ]
          },
          "active_projects_only": {
            "type": "boolean"
          },
          "totals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DetailedExpenseTotal"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DetailedExpenseRow"
            }
          }
        },
        "additionalProperties": false
      },
      "DetailedExpenseReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DetailedExpenseReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "MonthEndItem": {
        "type": "object",
        "required": [
          "subject_type",
          "subject_id",
          "description",
          "amount_cents",
          "currency",
          "target",
          "brand_name",
          "cost_cents",
          "margin_cents"
        ],
        "properties": {
          "subject_type": {
            "type": "string"
          },
          "subject_id": {
            "type": "integer",
            "minimum": 1
          },
          "description": {
            "type": "string"
          },
          "amount_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "target": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "brand_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "margin_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "MonthEndExclusion": {
        "type": "object",
        "required": [
          "invoice_id",
          "number",
          "reason"
        ],
        "properties": {
          "invoice_id": {
            "type": "integer",
            "minimum": 1
          },
          "number": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "MonthEndManifest": {
        "type": "object",
        "required": [
          "period_start",
          "period_end",
          "items",
          "excluded"
        ],
        "properties": {
          "period_start": {
            "type": "string",
            "format": "date"
          },
          "period_end": {
            "type": "string",
            "format": "date"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MonthEndItem"
            }
          },
          "excluded": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MonthEndExclusion"
            }
          }
        },
        "additionalProperties": false
      },
      "MonthEndManifestEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MonthEndManifest"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "BandedMonthRow": {
        "type": "object",
        "required": [
          "period_start",
          "period_end",
          "project_id",
          "project_name",
          "client_id",
          "client_name",
          "currency",
          "rounded_seconds",
          "billable_value_cents",
          "cost_value_cents",
          "entries_without_billable_rate",
          "entries_without_cost_rate",
          "claimed_in_other_currency",
          "billed_cents",
          "foregone_cents",
          "cost_ratio_basis_points",
          "cost_alert_basis_points",
          "cost_ratio_state"
        ],
        "properties": {
          "period_start": {
            "type": "string",
            "format": "date"
          },
          "period_end": {
            "type": "string",
            "format": "date"
          },
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "rounded_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "billable_value_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_value_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_cost_rate": {
            "type": "integer",
            "minimum": 0
          },
          "claimed_in_other_currency": {
            "type": "integer",
            "minimum": 0
          },
          "billed_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "foregone_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_ratio_basis_points": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_alert_basis_points": {
            "type": "integer",
            "minimum": 1
          },
          "cost_ratio_state": {
            "type": "string",
            "enum": [
              "within",
              "over",
              "unpriced",
              "unbilled"
            ]
          }
        },
        "additionalProperties": false
      },
      "BandedMonthReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "rows"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BandedMonthRow"
            }
          }
        },
        "additionalProperties": false
      },
      "BandedMonthReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BandedMonthReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "BandCostAlert": {
        "type": "object",
        "required": [
          "basis_points"
        ],
        "properties": {
          "basis_points": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20000
          }
        },
        "additionalProperties": false
      },
      "BandCostAlertEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BandCostAlert"
          }
        },
        "additionalProperties": false
      },
      "BandCostAlertInput": {
        "type": "object",
        "required": [
          "basis_points"
        ],
        "properties": {
          "basis_points": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20000
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityRow": {
        "type": "object",
        "required": [
          "project_id",
          "project_name",
          "project_code",
          "client_id",
          "client_name",
          "currency",
          "rounded_seconds",
          "revenue_cents",
          "cost_cents",
          "profit_cents",
          "return_on_cost_ppm",
          "revenue_fee_cents",
          "fees_included_in_delivery_cost_cents",
          "entries_without_billable_rate",
          "entries_without_cost_rate"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "project_name": {
            "type": "string"
          },
          "project_code": {
            "type": "string"
          },
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "client_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "rounded_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "revenue_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "profit_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "return_on_cost_ppm": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "revenue_fee_cents": {
            "type": "integer",
            "minimum": 0
          },
          "fees_included_in_delivery_cost_cents": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_cost_rate": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityTotals": {
        "type": "object",
        "required": [
          "rounded_seconds",
          "revenue_cents",
          "cost_cents",
          "profit_cents",
          "return_on_cost_ppm",
          "revenue_fee_cents",
          "fees_included_in_delivery_cost_cents",
          "entries_without_billable_rate",
          "entries_without_cost_rate",
          "projects_not_converted"
        ],
        "properties": {
          "rounded_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "revenue_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "profit_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "return_on_cost_ppm": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "revenue_fee_cents": {
            "type": "integer",
            "minimum": 0
          },
          "fees_included_in_delivery_cost_cents": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_cost_rate": {
            "type": "integer",
            "minimum": 0
          },
          "projects_not_converted": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityDimensionRow": {
        "type": "object",
        "required": [
          "dimension_id",
          "dimension_name",
          "currency",
          "rounded_seconds",
          "revenue_cents",
          "cost_cents",
          "profit_cents",
          "return_on_cost_ppm",
          "revenue_fee_cents",
          "fees_included_in_delivery_cost_cents",
          "entries_without_billable_rate",
          "entries_without_cost_rate",
          "included_in_headline"
        ],
        "properties": {
          "dimension_id": {
            "type": "integer",
            "minimum": 1
          },
          "dimension_name": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "rounded_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "revenue_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "profit_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "return_on_cost_ppm": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "revenue_fee_cents": {
            "type": "integer",
            "minimum": 0
          },
          "fees_included_in_delivery_cost_cents": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_billable_rate": {
            "type": "integer",
            "minimum": 0
          },
          "entries_without_cost_rate": {
            "type": "integer",
            "minimum": 0
          },
          "included_in_headline": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityTrendRow": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProfitabilityDimensionRow"
          },
          {
            "type": "object",
            "required": [
              "period_start",
              "period_end",
              "current"
            ],
            "properties": {
              "period_start": {
                "type": "string",
                "format": "date"
              },
              "period_end": {
                "type": "string",
                "format": "date"
              },
              "current": {
                "type": "boolean"
              }
            }
          }
        ]
      },
      "ProfitabilityFilters": {
        "type": "object",
        "required": [
          "project_status",
          "billing_method",
          "manager_id",
          "tag_id"
        ],
        "properties": {
          "project_status": {
            "type": "string",
            "enum": [
              "all",
              "active",
              "archived"
            ]
          },
          "billing_method": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "non_billable",
                  "time_materials",
                  "fixed_fee"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "manager_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "tag_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityReport": {
        "type": "object",
        "required": [
          "from",
          "to",
          "organization_currency",
          "rows",
          "clients",
          "teammates",
          "tasks",
          "trend",
          "totals",
          "filters",
          "previous_from",
          "previous_to",
          "previous_totals"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "organization_currency": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfitabilityRow"
            }
          },
          "clients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfitabilityDimensionRow"
            }
          },
          "teammates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfitabilityDimensionRow"
            }
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfitabilityDimensionRow"
            }
          },
          "trend": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProfitabilityTrendRow"
            }
          },
          "totals": {
            "$ref": "#/components/schemas/ProfitabilityTotals"
          },
          "filters": {
            "$ref": "#/components/schemas/ProfitabilityFilters"
          },
          "previous_from": {
            "type": "string",
            "format": "date"
          },
          "previous_to": {
            "type": "string",
            "format": "date"
          },
          "previous_totals": {
            "$ref": "#/components/schemas/ProfitabilityTotals"
          }
        },
        "additionalProperties": false
      },
      "ProfitabilityReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ProfitabilityReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ClientRollupCurrency": {
        "type": "object",
        "required": [
          "currency",
          "expense_cents"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "expense_cents": {
            "type": "integer",
            "minimum": 0
          },
          "uninvoiced_time_cents": {
            "type": "integer"
          },
          "uninvoiced_expense_cents": {
            "type": "integer",
            "minimum": 0
          },
          "uninvoiced_total_cents": {
            "type": "integer"
          },
          "money_budget_cents": {
            "type": "integer",
            "minimum": 0
          },
          "cost_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "ClientRollupMetrics": {
        "type": "object",
        "required": [
          "time_entry_count",
          "expense_count",
          "rounded_seconds",
          "billable_seconds",
          "budgeted_seconds",
          "time_budget_seconds",
          "unpriced_billable_entry_count",
          "unpriced_cost_entry_count",
          "currencies"
        ],
        "properties": {
          "time_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "expense_count": {
            "type": "integer",
            "minimum": 0
          },
          "rounded_seconds": {
            "type": "integer"
          },
          "billable_seconds": {
            "type": "integer"
          },
          "budgeted_seconds": {
            "type": "integer"
          },
          "time_budget_seconds": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_billable_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "unpriced_cost_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "currencies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientRollupCurrency"
            }
          }
        },
        "additionalProperties": false
      },
      "ClientRollupNode": {
        "type": "object",
        "required": [
          "client_id",
          "name",
          "parent_client_id",
          "depth",
          "direct",
          "rollup"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "parent_client_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "depth": {
            "type": "integer",
            "minimum": 0
          },
          "direct": {
            "$ref": "#/components/schemas/ClientRollupMetrics"
          },
          "rollup": {
            "$ref": "#/components/schemas/ClientRollupMetrics"
          }
        },
        "additionalProperties": false
      },
      "ClientRollupReport": {
        "type": "object",
        "required": [
          "root_client_id",
          "from",
          "to",
          "nodes"
        ],
        "properties": {
          "root_client_id": {
            "type": "integer",
            "minimum": 1
          },
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "nodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientRollupNode"
            }
          }
        },
        "additionalProperties": false
      },
      "ClientRollupReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ClientRollupReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ProjectBudgetGrain": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "unit",
          "calculation",
          "unpriced_entry_count"
        ],
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "project",
              "task_assignment",
              "user_assignment"
            ]
          },
          "source_id": {
            "type": "integer",
            "minimum": 1
          },
          "unit": {
            "type": "string",
            "enum": [
              "seconds",
              "cents"
            ]
          },
          "calculation": {
            "type": "string",
            "enum": [
              "time",
              "billable",
              "cost"
            ]
          },
          "unpriced_entry_count": {
            "type": "integer",
            "minimum": 0
          },
          "budget_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "spent_seconds": {
            "type": "integer"
          },
          "remaining_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "budget_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "spent_cents": {
            "type": "integer"
          },
          "remaining_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "ProjectBudgetReport": {
        "type": "object",
        "required": [
          "project_id",
          "budget_by",
          "expenses_included",
          "from",
          "to",
          "grains"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "budget_by": {
            "type": "string",
            "enum": [
              "project",
              "project_cost",
              "task",
              "task_fees",
              "person",
              "none"
            ]
          },
          "expenses_included": {
            "type": "boolean"
          },
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "grains": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProjectBudgetGrain"
            }
          }
        },
        "additionalProperties": false
      },
      "ProjectBudgetReportEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ProjectBudgetReport"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ProjectBudgetSummary": {
        "type": "object",
        "required": [
          "project_id",
          "currency",
          "budget_by",
          "unit",
          "unpriced_entry_count"
        ],
        "properties": {
          "project_id": {
            "type": "integer",
            "minimum": 1
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "budget_by": {
            "type": "string",
            "enum": [
              "project",
              "project_cost",
              "task",
              "task_fees",
              "person",
              "none"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "seconds",
              "cents",
              null
            ]
          },
          "unpriced_entry_count": {
            "type": "integer",
            "minimum": 1
          },
          "budget_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "spent_seconds": {
            "type": "integer"
          },
          "remaining_seconds": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "budget_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "spent_cents": {
            "type": "integer"
          },
          "remaining_cents": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "cost_cents": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      },
      "ProjectBudgetSummaryListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProjectBudgetSummary"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ClientHierarchyNode": {
        "type": "object",
        "required": [
          "ancestor_id",
          "descendant_id",
          "depth"
        ],
        "properties": {
          "ancestor_id": {
            "type": "integer",
            "minimum": 1
          },
          "descendant_id": {
            "type": "integer",
            "minimum": 1
          },
          "depth": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "ClientHierarchyListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientHierarchyNode"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "ModuleState": {
        "type": "object",
        "required": [
          "module",
          "enabled"
        ],
        "properties": {
          "module": {
            "type": "string",
            "enum": [
              "approval",
              "expenses",
              "own_money"
            ]
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ModuleListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModuleState"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "SignInMethodState": {
        "type": "object",
        "required": [
          "method",
          "configured",
          "enabled"
        ],
        "properties": {
          "method": {
            "type": "string",
            "enum": [
              "password",
              "magic_link",
              "google",
              "github",
              "apple"
            ]
          },
          "configured": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SignInMethodListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SignInMethodState"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "SsoDomain": {
        "type": "object",
        "required": [
          "id",
          "domain",
          "verified",
          "verified_at",
          "last_checked_at",
          "record_name",
          "record_type",
          "record_value",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "domain": {
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          },
          "verified_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "last_checked_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_name": {
            "type": "string"
          },
          "record_type": {
            "const": "TXT"
          },
          "record_value": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "updated_at": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "SsoDomainCheck": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SsoDomain"
          },
          {
            "type": "object",
            "required": [
              "dnssec_validated"
            ],
            "properties": {
              "dnssec_validated": {
                "type": "boolean"
              }
            }
          }
        ]
      },
      "SsoDomainListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SsoDomain"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "SsoDomainEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SsoDomain"
          }
        },
        "additionalProperties": false
      },
      "SsoDomainCheckEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SsoDomainCheck"
          }
        },
        "additionalProperties": false
      },
      "BrandAsset": {
        "type": "object",
        "required": [
          "slot",
          "content_hash",
          "content_type",
          "byte_size",
          "url",
          "updated_at"
        ],
        "properties": {
          "slot": {
            "enum": [
              "wordmark_light",
              "wordmark_dark",
              "favicon"
            ]
          },
          "content_hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "content_type": {
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ]
          },
          "byte_size": {
            "type": "integer",
            "minimum": 1
          },
          "url": {
            "type": "string"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "BrandAssetListEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BrandAsset"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "BrandMark": {
        "type": "object",
        "required": [
          "slot",
          "url",
          "content_type",
          "updated_at"
        ],
        "properties": {
          "slot": {
            "enum": [
              "wordmark_light",
              "wordmark_dark",
              "favicon"
            ]
          },
          "url": {
            "type": "string"
          },
          "content_type": {
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Brand": {
        "type": "object",
        "required": [
          "organization_name",
          "assets"
        ],
        "properties": {
          "organization_name": {
            "type": "string"
          },
          "assets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BrandMark"
            }
          },
          "palette": {
            "$ref": "#/components/schemas/InstancePalette"
          }
        },
        "additionalProperties": false
      },
      "BrandEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Brand"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "BrandAssetEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BrandAsset"
          }
        },
        "additionalProperties": false
      },
      "BrandAssetUploadInput": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          }
        },
        "additionalProperties": false
      },
      "InstancePalette": {
        "type": "object",
        "additionalProperties": {
          "type": "string",
          "pattern": "^#[0-9A-F]{6}$"
        }
      },
      "InstanceTheme": {
        "type": "object",
        "required": [
          "palette",
          "updated_at"
        ],
        "properties": {
          "palette": {
            "$ref": "#/components/schemas/InstancePalette"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "InstanceThemeEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InstanceTheme"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "InstanceThemeInput": {
        "type": "object",
        "required": [
          "palette"
        ],
        "properties": {
          "palette": {
            "$ref": "#/components/schemas/InstancePalette"
          }
        },
        "additionalProperties": false
      },
      "BillStatus": {
        "type": "object",
        "required": [
          "configured",
          "company_id",
          "environment",
          "can_send_from_bill"
        ],
        "properties": {
          "configured": {
            "type": "boolean"
          },
          "company_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "environment": {
            "enum": [
              "sandbox",
              "production"
            ]
          },
          "can_send_from_bill": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "BillStatusEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BillStatus"
          }
        },
        "additionalProperties": false
      },
      "BillClientDelivery": {
        "type": "object",
        "required": [
          "client_id",
          "deliver_via_bill"
        ],
        "properties": {
          "client_id": {
            "type": "integer",
            "minimum": 1
          },
          "deliver_via_bill": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "BillClientDeliveryEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BillClientDelivery"
          }
        },
        "additionalProperties": false
      },
      "InvoicePaymentLinkEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "invoice_id",
              "url"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "url": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "IncompleteRecurringInvoiceListEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "harvest_id",
                "client_id",
                "client_name",
                "invoice_count",
                "created_at",
                "updated_at"
              ],
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1
                },
                "harvest_id": {
                  "type": "integer",
                  "nullable": true
                },
                "client_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "client_name": {
                  "type": "string"
                },
                "invoice_count": {
                  "type": "integer",
                  "minimum": 1
                },
                "created_at": {
                  "type": "string"
                },
                "updated_at": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "RecurringInvoiceCompletionEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "id",
              "completed"
            ],
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1
              },
              "completed": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "InvoiceThankYouPreferenceEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "invoice_id",
              "auto_thank_you",
              "organization_auto_thank_you",
              "effective"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "auto_thank_you": {
                "type": "boolean",
                "nullable": true
              },
              "organization_auto_thank_you": {
                "type": "boolean"
              },
              "effective": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "OrganizationInvoiceThankYouEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "auto_thank_you"
            ],
            "properties": {
              "auto_thank_you": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "ReminderPolicy": {
        "type": "object",
        "required": [
          "first_after_days",
          "every_days"
        ],
        "properties": {
          "first_after_days": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3650
          },
          "every_days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 365
          }
        },
        "additionalProperties": false
      },
      "OrganizationInvoiceRemindersInput": {
        "type": "object",
        "required": [
          "reminder_policy"
        ],
        "properties": {
          "reminder_policy": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ReminderPolicy"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "OrganizationInvoiceRemindersEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "reminder_policy"
            ],
            "properties": {
              "reminder_policy": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ReminderPolicy"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "InvoiceDocumentPreferenceEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "invoice_id",
              "attach_pdf",
              "organization_attach_pdf",
              "effective",
              "attach_files",
              "organization_attach_files",
              "effective_files",
              "attach_journal",
              "organization_attach_journal",
              "effective_journal"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "attach_pdf": {
                "type": "boolean",
                "nullable": true
              },
              "organization_attach_pdf": {
                "type": "boolean"
              },
              "effective": {
                "type": "boolean"
              },
              "attach_files": {
                "type": "boolean",
                "nullable": true
              },
              "organization_attach_files": {
                "type": "boolean"
              },
              "effective_files": {
                "type": "boolean"
              },
              "attach_journal": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "detailed",
                      "summary"
                    ]
                  },
                  {
                    "type": "boolean"
                  }
                ],
                "nullable": true
              },
              "organization_attach_journal": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "detailed",
                      "summary"
                    ]
                  },
                  {
                    "type": "boolean"
                  }
                ]
              },
              "effective_journal": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "detailed",
                      "summary"
                    ]
                  },
                  {
                    "type": "boolean"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "OrganizationInvoiceDocumentsEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "attach_pdf",
              "attach_files",
              "attach_journal"
            ],
            "properties": {
              "attach_pdf": {
                "type": "boolean"
              },
              "attach_files": {
                "type": "boolean"
              },
              "attach_journal": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "detailed",
                      "summary"
                    ]
                  },
                  {
                    "type": "boolean"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "ReleasedTimeEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "invoice_id",
              "released"
            ],
            "properties": {
              "invoice_id": {
                "type": "integer",
                "minimum": 1
              },
              "released": {
                "type": "integer",
                "minimum": 1
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "PayoutAccount": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "provider",
          "external_id",
          "linked_by_user_id",
          "linked_at",
          "verified_at"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "user_id": {
            "type": "integer",
            "minimum": 1
          },
          "provider": {
            "enum": [
              "deel",
              "wise"
            ]
          },
          "external_id": {
            "type": "string"
          },
          "linked_by_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "linked_at": {
            "type": "string",
            "format": "date-time"
          },
          "verified_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "PayoutAccountListEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PayoutAccount"
            }
          }
        },
        "additionalProperties": false
      },
      "PayoutAccountEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PayoutAccount"
          }
        },
        "additionalProperties": false
      },
      "PayoutAccountInput": {
        "type": "object",
        "required": [
          "provider",
          "external_id"
        ],
        "properties": {
          "provider": {
            "enum": [
              "deel",
              "wise"
            ]
          },
          "external_id": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "BillClientDeliveryInput": {
        "type": "object",
        "required": [
          "deliver_via_bill"
        ],
        "properties": {
          "deliver_via_bill": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SsoDomainInput": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorStatus": {
        "type": "object",
        "required": [
          "enrolled",
          "pending_confirmation",
          "recovery_codes_remaining"
        ],
        "properties": {
          "enrolled": {
            "type": "boolean"
          },
          "pending_confirmation": {
            "type": "boolean"
          },
          "recovery_codes_remaining": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "TwoFactorStatusEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TwoFactorStatus"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorEnrolment": {
        "type": "object",
        "required": [
          "secret",
          "otpauth_uri",
          "recovery_codes"
        ],
        "properties": {
          "secret": {
            "type": "string"
          },
          "otpauth_uri": {
            "type": "string"
          },
          "recovery_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "TwoFactorEnrolmentEnvelope": {
        "type": "object",
        "required": [
          "data",
          "links"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TwoFactorEnrolment"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorCodeInput": {
        "type": "object",
        "required": [
          "code"
        ],
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorChallengeIssued": {
        "type": "object",
        "required": [
          "status",
          "challenge",
          "expires_at"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "two_factor_required"
            ]
          },
          "challenge": {
            "type": "string"
          },
          "expires_at": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorChallengeInput": {
        "type": "object",
        "required": [
          "code"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "challenge": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorChallengeAccepted": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "authenticated"
            ]
          }
        },
        "additionalProperties": false
      },
      "TwoFactorChallengeAcceptedEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TwoFactorChallengeAccepted"
          }
        },
        "additionalProperties": false
      },
      "SignInResult": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/AuthPrincipal"
          },
          {
            "$ref": "#/components/schemas/TwoFactorChallengeIssued"
          }
        ]
      },
      "SignInResultEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SignInResult"
          }
        },
        "additionalProperties": false
      },
      "UserEmailInput": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "UserEmailAcceptedEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "status",
              "email"
            ],
            "properties": {
              "status": {
                "const": "verification_sent"
              },
              "email": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "ModulePatch": {
        "type": "object",
        "required": [
          "enabled"
        ],
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    }
  }
}