{
  "openapi": "3.0.3",
  "info": {
    "title": "HoundDog API v2",
    "version": "2.0.0",
    "description": "The HoundDog API v2 contract. The prose reference, with the conventions every operation follows (authentication, pagination, errors, rate limits, webhooks), is served at /api/docs/v2."
  },
  "servers": [
    {
      "url": "https://app.hounddog.com/api/v2"
    }
  ],
  "security": [
    {
      "ApiKey": []
    }
  ],
  "tags": [
    {
      "name": "Parties",
      "description": "Parties and their contacts, actions and events."
    },
    {
      "name": "Certificates",
      "description": "Certificates, direct uploads and the parsed coverage data."
    },
    {
      "name": "Approval overrides",
      "description": "Marking parties compliant without a certificate."
    },
    {
      "name": "Compliance requests",
      "description": "The requests behind each party's status (read-only)."
    },
    {
      "name": "Insurance requirements",
      "description": "Requirements and custom coverage definitions."
    },
    {
      "name": "Projects",
      "description": "Projects, party attachment and lifecycle. Every route needs projects enabled on the account; otherwise 403 feature_disabled."
    },
    {
      "name": "Compliance profiles",
      "description": "Multi-factor compliance profiles. Every route needs multi-factor compliance on the account; otherwise 403 feature_disabled."
    },
    {
      "name": "Documents",
      "description": "General files kept on a party. Every route needs documents enabled on the account; otherwise 403 feature_disabled."
    },
    {
      "name": "Events",
      "description": "The account's event log."
    },
    {
      "name": "Webhook subscriptions",
      "description": "Webhook management and the delivery log."
    },
    {
      "name": "Account and users",
      "description": "Account settings and dashboard users."
    },
    {
      "name": "W-9s",
      "description": "W-9 requests, uploads and downloads. Reads always work; every write needs W-9 collection enabled on the account, otherwise 403 feature_disabled."
    },
    {
      "name": "Document signing",
      "description": "Signing templates and signing requests. Reads always work; every write needs document signing enabled on the account, otherwise 403 feature_disabled."
    },
    {
      "name": "Requirement statuses",
      "description": "Per-requirement status rows."
    },
    {
      "name": "Custom fields",
      "description": "The account's custom field definitions: list, read, create, update, archive and unarchive (never delete). Every route needs custom fields enabled on the account; otherwise 403 feature_disabled."
    }
  ],
  "paths": {
    "/parties": {
      "get": {
        "tags": [
          "Parties"
        ],
        "summary": "List parties",
        "operationId": "listParties",
        "description": "With include=detail the data array holds PartyDetail entities.",
        "parameters": [
          {
            "name": "lifecycle[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "active",
                  "paused",
                  "incomplete",
                  "archived",
                  "jobtread_archived"
                ]
              }
            },
            "description": "When lifecycle[] is omitted, active applies even when status[] is given (the dashboard drops that default whenever a status chip is selected; the API does not)."
          },
          {
            "name": "status[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "compliant",
                  "marked_compliant",
                  "in_progress",
                  "unresponsive",
                  "no_requirements"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "name": "external_id",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "external_id_2",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "external_id_3",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "email",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tag_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "insurance_requirement_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "compliance_profile_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Free-text search on the name."
          },
          {
            "name": "include",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "detail"
              ]
            },
            "description": "detail returns PartyDetail entries (PartyDetailList) with per_page capped at 50."
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. PartyList by default; PartyDetailList when include=detail (per_page capped at 50).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/PartyList"
                    },
                    {
                      "$ref": "#/components/schemas/PartyDetailList"
                    }
                  ],
                  "description": "PartyList by default; PartyDetailList when include=detail is given (per_page capped at 50). anyOf, not oneOf: the detail entity is a superset of the summary and an empty page satisfies both."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Create a party",
        "operationId": "createParty",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartyCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}": {
      "get": {
        "tags": [
          "Parties"
        ],
        "summary": "Get a party",
        "operationId": "getParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Parties"
        ],
        "summary": "Update a party",
        "operationId": "updateParty",
        "description": "Updates the fields sent and leaves the rest alone. insurance_requirement_id: null (under multi-factor compliance, compliance_profile_id: null) moves the party to No Requirements only where the account allows that option; otherwise it is 422 validation_failed naming the field. A null sent for a party that already has no requirement (or no compliance profile) is accepted and changes nothing, so the requirement a GET serves can be sent back as read; under project compliance without multi-factor compliance a party-level insurance_requirement_id: null is always 422.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartyUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/WriteConflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/archive": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Archive a party",
        "description": "Repeating a lifecycle action (archiving an archived party, pausing a paused one, and the reverses) is 422 validation_failed.",
        "operationId": "archiveParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/unarchive": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Unarchive a party",
        "description": "Repeating a lifecycle action (archiving an archived party, pausing a paused one, and the reverses) is 422 validation_failed.",
        "operationId": "unarchiveParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/pause": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Pause a party",
        "description": "Needs enable_pausing (403 feature_disabled otherwise). Repeating a lifecycle action (archiving an archived party, pausing a paused one, and the reverses) is 422 validation_failed.",
        "operationId": "pauseParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/unpause": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Unpause a party",
        "description": "Always allowed for a paused party, whether or not the account has enable_pausing (the dashboard offers Unpause for any paused party, and a merged-away duplicate is left paused). Repeating a lifecycle action (archiving an archived party, pausing a paused one, and the reverses) is 422 validation_failed.",
        "operationId": "unpauseParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/invalidate_certificates": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Invalidate every active certificate",
        "operationId": "invalidateCertificatesParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/send_reminder": {
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Send a manual reminder",
        "operationId": "sendPartyReminder",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendReminder"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyDetail"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/events": {
      "get": {
        "tags": [
          "Parties"
        ],
        "summary": "List a party's events",
        "operationId": "listPartyEvents",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "event_type[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "parent_event_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Events a given dashboard user performed (kept from V1 for parity)."
          },
          {
            "name": "since_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/contacts": {
      "get": {
        "tags": [
          "Parties"
        ],
        "summary": "List a party's contacts",
        "operationId": "listPartyContacts",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyContactList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Parties"
        ],
        "summary": "Add a contact",
        "operationId": "createPartyContact",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartyContactCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyContact"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/contacts/{contact_id}": {
      "patch": {
        "tags": [
          "Parties"
        ],
        "summary": "Update a contact",
        "operationId": "updatePartyContact",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "contact_id",
            "in": "path",
            "required": true,
            "description": "Contact id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartyContactUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartyContact"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Parties"
        ],
        "summary": "Delete a contact",
        "operationId": "deletePartyContact",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "contact_id",
            "in": "path",
            "required": true,
            "description": "Contact id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted. Deleting the primary contact is 422."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/certificates": {
      "get": {
        "tags": [
          "Certificates"
        ],
        "summary": "List certificates",
        "operationId": "listCertificates",
        "parameters": [
          {
            "name": "party_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CertificateList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Certificates"
        ],
        "summary": "Upload a certificate",
        "operationId": "createCertificate",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CertificateCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Certificate"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/certificates/{id}": {
      "get": {
        "tags": [
          "Certificates"
        ],
        "summary": "Get a certificate",
        "operationId": "getCertificate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Certificate"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/direct_uploads": {
      "post": {
        "tags": [
          "Certificates"
        ],
        "summary": "Reserve a direct upload",
        "operationId": "createDirectUpload",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DirectUploadRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DirectUpload"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/certificates/{id}/invalidate": {
      "post": {
        "tags": [
          "Certificates"
        ],
        "summary": "Invalidate a certificate",
        "operationId": "invalidateCertificate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Certificate"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/certificates/{id}/restore": {
      "post": {
        "tags": [
          "Certificates"
        ],
        "summary": "Restore an invalidated certificate",
        "operationId": "restoreCertificate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Certificate"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/certificates/{id}/download": {
      "get": {
        "tags": [
          "Certificates"
        ],
        "summary": "Download a certificate file",
        "operationId": "downloadCertificate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "302": {
            "description": "Redirect to a short-lived file URL.",
            "headers": {
              "Location": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/insurance_documents": {
      "get": {
        "tags": [
          "Certificates"
        ],
        "summary": "List a party's insurance documents",
        "operationId": "listPartyInsuranceDocuments",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceDocumentList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Newest first. Not feature-gated. An individual's id is 404."
      }
    },
    "/insurance_documents/{id}": {
      "get": {
        "tags": [
          "Certificates"
        ],
        "summary": "Get an insurance document",
        "operationId": "getInsuranceDocument",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceDocument"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/approval_overrides": {
      "get": {
        "tags": [
          "Approval overrides"
        ],
        "summary": "List a party's approval overrides",
        "operationId": "listApprovalOverrides",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalOverrideList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Approval overrides"
        ],
        "summary": "Create an approval override",
        "operationId": "createApprovalOverride",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalOverrideWrite"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalOverride"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/approval_overrides/{id}": {
      "patch": {
        "tags": [
          "Approval overrides"
        ],
        "summary": "Update an approval override",
        "operationId": "updateApprovalOverride",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalOverrideWrite"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalOverride"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/approval_overrides/{id}/revoke": {
      "post": {
        "tags": [
          "Approval overrides"
        ],
        "summary": "Revoke an approval override",
        "operationId": "revokeApprovalOverride",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalOverride"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/compliance_requests": {
      "get": {
        "tags": [
          "Compliance requests"
        ],
        "summary": "List a party's compliance requests",
        "operationId": "listComplianceRequests",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceRequestList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/compliance_requests/{id}": {
      "get": {
        "tags": [
          "Compliance requests"
        ],
        "summary": "Get a compliance request",
        "operationId": "getComplianceRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceRequest"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/insurance_requirements": {
      "get": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "List insurance requirements",
        "operationId": "listInsuranceRequirements",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceRequirementList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "Create an insurance requirement",
        "operationId": "createInsuranceRequirement",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InsuranceRequirementCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceRequirement"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/insurance_requirements/{id}": {
      "get": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "Get an insurance requirement",
        "operationId": "getInsuranceRequirement",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceRequirement"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "Update an insurance requirement",
        "description": "On a JobTread-connected account a rename is refused with 422 validation_failed (contact HoundDog support).",
        "operationId": "updateInsuranceRequirement",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InsuranceRequirementUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsuranceRequirement"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "Delete an insurance requirement",
        "operationId": "deleteInsuranceRequirement",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/coverage_types": {
      "get": {
        "tags": [
          "Insurance requirements"
        ],
        "summary": "List coverage types",
        "description": "Every coverage type a requirement or a certificate can carry, with its requirement fields; inactive types included. The list can grow: discover it rather than hardcoding it.",
        "operationId": "listCoverageTypes",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageTypeList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "List projects",
        "operationId": "listProjects",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Create a project",
        "operationId": "createProject",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Get a project",
        "operationId": "getProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Projects"
        ],
        "summary": "Update a project",
        "operationId": "updateProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/WriteConflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Projects"
        ],
        "summary": "Delete a project",
        "operationId": "deleteProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Deletes a project. On a project-compliance account a project is never deleted: 422 validation_failed, close it with complete or archive instead. Also 422 when document signing requests belong to it."
      }
    },
    "/projects/{id}/parties": {
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Attach a party to a project",
        "operationId": "attachProjectParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectPartyAttach"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}/parties/{party_id}": {
      "delete": {
        "tags": [
          "Projects"
        ],
        "summary": "Detach a party from a project",
        "operationId": "detachProjectParty",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "party_id",
            "in": "path",
            "required": true,
            "description": "Party id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}/complete": {
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Complete a project",
        "description": "Needs project lifecycles on the account (project compliance, or project dates); 403 feature_disabled otherwise.",
        "operationId": "completeProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}/uncomplete": {
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Reopen a completed project",
        "description": "Needs project lifecycles on the account (project compliance, or project dates); 403 feature_disabled otherwise.",
        "operationId": "uncompleteProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectReopen"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}/archive": {
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Archive a project",
        "description": "Needs project lifecycles on the account (project compliance, or project dates); 403 feature_disabled otherwise.",
        "operationId": "archiveProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/projects/{id}/unarchive": {
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Unarchive a project",
        "description": "Needs project lifecycles on the account (project compliance, or project dates); 403 feature_disabled otherwise.",
        "operationId": "unarchiveProject",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectReopen"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/compliance_profiles": {
      "get": {
        "tags": [
          "Compliance profiles"
        ],
        "summary": "List compliance profiles",
        "operationId": "listComplianceProfiles",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceProfileList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Compliance profiles"
        ],
        "summary": "Create a compliance profile",
        "operationId": "createComplianceProfile",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ComplianceProfileCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceProfile"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/compliance_profiles/{id}": {
      "get": {
        "tags": [
          "Compliance profiles"
        ],
        "summary": "Get a compliance profile",
        "operationId": "getComplianceProfile",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceProfile"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Compliance profiles"
        ],
        "summary": "Update a compliance profile",
        "operationId": "updateComplianceProfile",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ComplianceProfileUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceProfile"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Compliance profiles"
        ],
        "summary": "Archive a compliance profile",
        "operationId": "archiveComplianceProfile",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceProfile"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/documents": {
      "get": {
        "tags": [
          "Documents"
        ],
        "summary": "List documents",
        "operationId": "listDocuments",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Documents"
        ],
        "summary": "Upload a document",
        "operationId": "createDocument",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DocumentCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/documents/{id}": {
      "get": {
        "tags": [
          "Documents"
        ],
        "summary": "Get a document",
        "operationId": "getDocument",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Documents"
        ],
        "summary": "Delete a document",
        "operationId": "deleteDocument",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/parties/{id}/documents": {
      "get": {
        "tags": [
          "Documents"
        ],
        "summary": "List a party's documents",
        "operationId": "listPartyDocuments",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/events": {
      "get": {
        "tags": [
          "Events"
        ],
        "summary": "List events",
        "operationId": "listEvents",
        "parameters": [
          {
            "name": "event_type[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "party_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "parent_event_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Events a given dashboard user performed (kept from V1 for parity)."
          },
          {
            "name": "since_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Events with an id greater than this."
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/events/{id}": {
      "get": {
        "tags": [
          "Events"
        ],
        "summary": "Get an event",
        "operationId": "getEvent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_subscriptions": {
      "get": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "List webhook subscriptions",
        "operationId": "listWebhookSubscriptions",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscriptionList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Create a webhook subscription",
        "operationId": "createWebhookSubscription",
        "description": "Returns the secret once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookSubscriptionCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscriptionWithSecret"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_subscriptions/{id}": {
      "get": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Get a webhook subscription",
        "operationId": "getWebhookSubscription",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscription"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Update a webhook subscription",
        "operationId": "updateWebhookSubscription",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookSubscriptionUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscription"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Delete a webhook subscription",
        "operationId": "deleteWebhookSubscription",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_subscriptions/{id}/test": {
      "post": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Send a test delivery",
        "operationId": "testWebhookSubscription",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDelivery"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_subscriptions/{id}/rotate_secret": {
      "post": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Rotate the signing secret",
        "operationId": "rotateWebhookSecret",
        "description": "422 for a payload_version 1 subscription.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscriptionWithSecret"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_subscriptions/{id}/deliveries": {
      "get": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "List recent deliveries",
        "operationId": "listWebhookDeliveries",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDeliveryList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/webhook_event_types": {
      "get": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "List subscribable event types",
        "operationId": "listWebhookEventTypes",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEventTypeList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/account": {
      "get": {
        "tags": [
          "Account and users"
        ],
        "summary": "Get the account",
        "operationId": "getAccount",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Account and users"
        ],
        "summary": "Update account settings",
        "operationId": "updateAccount",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Updates the settings sent and leaves the rest alone. require_mfa, require_approval_override_date and require_approval_override_notes are read-only through the API: sending the value already served is accepted and changes nothing; any other value is 422 validation_failed naming the field, and nothing is changed. A setting whose feature is off for the account: a changed value is 403 feature_disabled naming the field; the stored value sent back is accepted and changes nothing. A setting the dashboard offers as a list of choices accepts a changed value only from that list (422 validation_failed naming the field otherwise)."
      }
    },
    "/users": {
      "get": {
        "tags": [
          "Account and users"
        ],
        "summary": "List users",
        "operationId": "listUsers",
        "parameters": [
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Account and users"
        ],
        "summary": "Invite a user",
        "operationId": "inviteUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInvite"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/users/{id}": {
      "patch": {
        "tags": [
          "Account and users"
        ],
        "summary": "Update a user",
        "operationId": "updateUser",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "Account and users"
        ],
        "summary": "Remove a user",
        "operationId": "deleteUser",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/w9s": {
      "get": {
        "tags": [
          "W-9s"
        ],
        "summary": "List W-9s",
        "operationId": "listW9s",
        "parameters": [
          {
            "name": "party_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "complete"
              ]
            }
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/W9List"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "W-9s"
        ],
        "summary": "Request a W-9",
        "operationId": "createW9",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/W9Create"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/W9"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs W-9 collection enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/w9s/{id}": {
      "get": {
        "tags": [
          "W-9s"
        ],
        "summary": "Get a W-9",
        "operationId": "getW9",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/W9"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "delete": {
        "tags": [
          "W-9s"
        ],
        "summary": "Delete a W-9",
        "operationId": "deleteW9",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Success, no body."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs W-9 collection enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/parties/{id}/w9": {
      "post": {
        "tags": [
          "W-9s"
        ],
        "summary": "Upload a completed W-9",
        "operationId": "uploadPartyW9",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/W9Upload"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/W9"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs W-9 collection enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/w9s/{id}/download": {
      "get": {
        "tags": [
          "W-9s"
        ],
        "summary": "Download a W-9 PDF",
        "operationId": "downloadW9",
        "description": "Requires the key's w9 grant (403 forbidden otherwise).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The file, streamed.",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/signing_templates": {
      "get": {
        "tags": [
          "Document signing"
        ],
        "summary": "List signing templates",
        "operationId": "listSigningTemplates",
        "parameters": [
          {
            "name": "active",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningTemplateList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/signing_templates/{id}": {
      "get": {
        "tags": [
          "Document signing"
        ],
        "summary": "Get a signing template",
        "operationId": "getSigningTemplate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningTemplate"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/signing_requests": {
      "get": {
        "tags": [
          "Document signing"
        ],
        "summary": "List signing requests",
        "operationId": "listSigningRequests",
        "parameters": [
          {
            "name": "party_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "signing_template_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "completed",
                "no_longer_needed"
              ]
            }
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequestList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Document signing"
        ],
        "summary": "Create and send a signing request",
        "operationId": "createSigningRequest",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SigningRequestCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequest"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamFailed"
          }
        },
        "description": "Needs document signing enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/signing_requests/{id}": {
      "get": {
        "tags": [
          "Document signing"
        ],
        "summary": "Get a signing request",
        "operationId": "getSigningRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequest"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/signing_requests/{id}/resend": {
      "post": {
        "tags": [
          "Document signing"
        ],
        "summary": "Remind every unsigned signer",
        "operationId": "resendSigningRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequest"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs document signing enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/signing_requests/{id}/invalidate": {
      "post": {
        "tags": [
          "Document signing"
        ],
        "summary": "Mark a signing request no longer needed",
        "operationId": "invalidateSigningRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SigningRequestInvalidate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequest"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs document signing enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/signing_requests/upload_external": {
      "post": {
        "tags": [
          "Document signing"
        ],
        "summary": "Record a document signed outside the e-signature service",
        "operationId": "uploadExternalSignedDocument",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SigningRequestUploadExternal"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SigningRequest"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        },
        "description": "Needs document signing enabled on the account; otherwise 403 feature_disabled naming the feature."
      }
    },
    "/signing_requests/{id}/download": {
      "get": {
        "tags": [
          "Document signing"
        ],
        "summary": "Download the signed document",
        "operationId": "downloadSigningRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The file, streamed.",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamFailed"
          }
        }
      }
    },
    "/parties/{id}/requirement_statuses": {
      "get": {
        "tags": [
          "Requirement statuses"
        ],
        "summary": "List a party's requirement statuses",
        "operationId": "listPartyRequirementStatuses",
        "description": "The party's rows, whatever its lifecycle (an archived party's rows are frozen), ordered by scope, factor and requirement key. 501 not_implemented until requirement statuses are live.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "scope_type",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "party",
                "project"
              ]
            }
          },
          {
            "name": "scope_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Needs scope_type (400 otherwise)."
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequirementStatusList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "501": {
            "$ref": "#/components/responses/NotImplemented"
          }
        }
      }
    },
    "/requirement_statuses": {
      "get": {
        "tags": [
          "Requirement statuses"
        ],
        "summary": "List requirement statuses",
        "operationId": "listRequirementStatuses",
        "description": "Rows across the account, changed_at descending then id descending; the party lifecycle defaults to active. 501 not_implemented until requirement statuses are live.",
        "parameters": [
          {
            "name": "status[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "satisfied",
                  "waived",
                  "missing",
                  "lapsed",
                  "deficient"
                ]
              }
            }
          },
          {
            "name": "requirement_key[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "factor",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "insurance",
                "w9",
                "document_signing"
              ]
            }
          },
          {
            "name": "party_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "One party's rows. An individual's id, or another account's, is 422."
          },
          {
            "name": "project_id",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "The rows scoped to one project (project-compliance accounts only have them). 403 feature_disabled without projects; another account's id is 422."
          },
          {
            "name": "lifecycle[]",
            "in": "query",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "active",
                  "paused",
                  "incomplete",
                  "archived",
                  "jobtread_archived"
                ]
              }
            },
            "description": "The party's lifecycle, as on GET /parties. When lifecycle[] is omitted, active applies even when other filters (status[], party_id, project_id and the rest) are given; send every lifecycle you want to widen it."
          },
          {
            "name": "expires_before",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "expires_on strictly before this date; a row with no end date never matches."
          },
          {
            "name": "expires_after",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "expires_on strictly after this date; a row with no end date never matches."
          },
          {
            "name": "lapsed_since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "lapsed_on on or after this date."
          },
          {
            "name": "changed_since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "changed_at at or after this time."
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequirementStatusList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "501": {
            "$ref": "#/components/responses/NotImplemented"
          }
        }
      }
    },
    "/custom_fields": {
      "get": {
        "tags": [
          "Custom fields"
        ],
        "summary": "List custom fields",
        "operationId": "listCustomFields",
        "description": "The account's custom fields, ordered by id. Active fields only unless include_archived is true.",
        "parameters": [
          {
            "name": "applies_to",
            "in": "query",
            "description": "Only the fields available on this record type.",
            "schema": {
              "type": "string",
              "enum": [
                "parties",
                "projects"
              ]
            }
          },
          {
            "name": "include_archived",
            "in": "query",
            "description": "true also lists archived fields; by default only active fields are listed.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/PerPage"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomFieldList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "tags": [
          "Custom fields"
        ],
        "summary": "Create a custom field",
        "description": "Names are unique among the account's active fields (case-insensitive); an account has at most 50 active fields (422 validation_failed past it). Records the Custom Field Definition Created event.",
        "operationId": "createCustomField",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomFieldCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomField"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/custom_fields/{id}": {
      "get": {
        "tags": [
          "Custom fields"
        ],
        "summary": "Get a custom field",
        "operationId": "getCustomField",
        "description": "One of the account's custom fields, archived or not.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomField"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "patch": {
        "tags": [
          "Custom fields"
        ],
        "summary": "Update a custom field",
        "description": "Only the members sent change; the entity a GET serves, sent back unchanged, changes nothing (D28). Records Custom Field Definition Updated when something changed.",
        "operationId": "updateCustomField",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomFieldUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomField"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/FieldTypeConflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/custom_fields/{id}/archive": {
      "post": {
        "tags": [
          "Custom fields"
        ],
        "summary": "Archive a custom field",
        "description": "Hidden from every record's custom_fields, the dashboard's forms, pages, search, exports and imports; writes naming it are refused; its values are kept; a User-type field stops assigning. Archiving an archived field changes nothing. Records Custom Field Definition Archived.",
        "operationId": "archiveCustomField",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomField"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/custom_fields/{id}/unarchive": {
      "post": {
        "tags": [
          "Custom fields"
        ],
        "summary": "Unarchive a custom field",
        "description": "Restores the field and its values. 422 validation_failed when an active field has its name (naming name) or the account has 50 active fields. Unarchiving an active field changes nothing. Records Custom Field Definition Restored.",
        "operationId": "unarchiveCustomField",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomField"
                }
              }
            },
            "headers": {
              "Idempotency-Replayed": {
                "$ref": "#/components/headers/IdempotencyReplayed"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "Api-Key",
        "description": "<key_id>-<secret>"
      }
    },
    "parameters": {
      "Page": {
        "name": "page",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000000,
          "default": 1
        }
      },
      "PerPage": {
        "name": "per_page",
        "in": "query",
        "description": "Default 50; maximum 200 (50 with include=detail). Above the cap is a 400, never a clamp.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        }
      },
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "description": "Optional on every POST; see the Idempotency page.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 255
        }
      },
      "UpdatedSince": {
        "name": "updated_since",
        "in": "query",
        "description": "Records edited since this time. On parties it may also return parties whose compliance was recomputed. Not a status feed: for status changes read the events feed or webhooks.",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Malformed parameters (validation_failed).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "unauthorized",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "forbidden, account_deactivated, api_disabled, insufficient_scope, feature_disabled",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "not_found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Conflict": {
        "description": "conflict, idempotency_in_progress or idempotency_not_replayable",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UnprocessableEntity": {
        "description": "validation_failed, or another 422 code the operation documents",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "rate_limited, with Retry-After",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait.",
            "schema": {
              "type": "integer"
            }
          }
        }
      },
      "InternalError": {
        "description": "internal_error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotImplemented": {
        "description": "not_implemented",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UpstreamFailed": {
        "description": "upstream_failed. Nothing was kept; the request may be retried.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "WriteConflict": {
        "description": "conflict: another write stored the same custom field of this record at the same moment, so nothing was written; the request is safe to retry. The error carries no conflict member.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "FieldTypeConflict": {
        "description": "conflict: field_type cannot be changed once the field has values (details omitted, no conflict member).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "headers": {
      "IdempotencyReplayed": {
        "description": "Present on a replay: the request repeated an earlier one with the same Idempotency-Key, and the response is the resource the first request created or acted on, rendered as it is now (not a copy of the first response).",
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        }
      }
    },
    "schemas": {
      "ErrorDetail": {
        "type": "object",
        "required": [
          "field",
          "message"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ConflictRef": {
        "type": "object",
        "description": "The record a 409 conflict is about.",
        "required": [
          "resource",
          "id"
        ],
        "properties": {
          "resource": {
            "type": "string",
            "enum": [
              "signing_request",
              "w9"
            ]
          },
          "id": {
            "type": "integer"
          }
        }
      },
      "ErrorBody": {
        "type": "object",
        "required": [
          "code",
          "message",
          "request_id"
        ],
        "properties": {
          "code": {
            "description": "The error code. Each operation lists the codes it can return.",
            "anyOf": [
              {
                "$ref": "#/components/schemas/ErrorCode"
              },
              {
                "$ref": "#/components/schemas/ErrorCodeRelease2"
              }
            ]
          },
          "message": {
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "details": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ErrorDetail"
            },
            "description": "Present on validation errors, and on a feature_disabled caused by one field (naming that field)."
          },
          "conflict": {
            "$ref": "#/components/schemas/ConflictRef"
          }
        }
      },
      "ErrorCode": {
        "type": "string",
        "enum": [
          "validation_failed",
          "unauthorized",
          "forbidden",
          "account_deactivated",
          "api_disabled",
          "insufficient_scope",
          "feature_disabled",
          "not_found",
          "rate_limited",
          "internal_error"
        ]
      },
      "ErrorCodeRelease2": {
        "type": "string",
        "enum": [
          "conflict",
          "idempotency_in_progress",
          "idempotency_not_replayable",
          "idempotency_key_reused",
          "signing_template_invalid",
          "upstream_failed",
          "not_implemented"
        ]
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ErrorBody"
          }
        }
      },
      "PartyStatus": {
        "type": "object",
        "properties": {
          "compliant": {
            "type": "boolean"
          },
          "manually_compliant": {
            "type": "boolean"
          },
          "unresponsive": {
            "type": "boolean"
          },
          "unresponsive_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "no_requirements": {
            "type": "boolean"
          },
          "in_review": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "paused": {
            "type": "boolean"
          },
          "incomplete": {
            "type": "boolean"
          },
          "jobtread_archived": {
            "type": "boolean"
          }
        }
      },
      "Party": {
        "type": "object",
        "description": "The party list entity: the summary, status and custom fields.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "description": "null for an incomplete party.",
            "nullable": true
          },
          "slug": {
            "type": "string"
          },
          "email_address": {
            "type": "string",
            "nullable": true
          },
          "contact_first_name": {
            "type": "string",
            "nullable": true
          },
          "contact_last_name": {
            "type": "string",
            "nullable": true
          },
          "phone_number": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "address2": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "type": "string",
            "nullable": true
          },
          "postal_code": {
            "type": "string",
            "nullable": true
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "external_id_2": {
            "type": "string",
            "nullable": true
          },
          "external_id_3": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/PartyStatus"
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id: the account's active fields available on parties that hold a value (a field with no value is absent; {} when the account does not use custom fields). Served on the list and the detail.",
            "properties": {},
            "additionalProperties": {
              "$ref": "#/components/schemas/PartyCustomFieldValue"
            }
          }
        }
      },
      "PartyNoncompliance": {
        "type": "object",
        "properties": {
          "coverage": {
            "type": "string",
            "description": "null for the project-compliance summary entry 'Not Compliant with <project>'.",
            "nullable": true
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "PartyExpiration": {
        "type": "object",
        "properties": {
          "coverage": {
            "type": "string"
          },
          "expires_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          }
        }
      },
      "PartyContact": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "first_name": {
            "type": "string",
            "nullable": true
          },
          "last_name": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "description": "The primary contact may have no email (a phone-only party).",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Role keys: insurance, w9, signing, signing_recipient:<template recipient id>."
          },
          "active": {
            "type": "boolean"
          },
          "opted_out": {
            "type": "boolean"
          },
          "is_primary": {
            "type": "boolean"
          },
          "factor_opt_outs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Primary only: the factors the main contact no longer receives."
          }
        }
      },
      "PartyContactCreate": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "roles": {
            "type": "array",
            "description": "Role keys from the account's vocabulary: insurance, w9, signing, and signing_recipient:<template recipient id> for one seat of one signing template. Needs contact routing enabled on the account (enable_contact_routing); 403 feature_disabled otherwise, except that the value already served sent back ([] without contact routing, on a create too) is accepted and changes nothing.",
            "items": {
              "type": "string"
            }
          },
          "active": {
            "type": "boolean"
          },
          "opted_out": {
            "type": "boolean"
          }
        }
      },
      "PartyContactUpdate": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "roles": {
            "type": "array",
            "description": "Role keys from the account's vocabulary: insurance, w9, signing, and signing_recipient:<template recipient id> for one seat of one signing template. Needs contact routing enabled on the account (enable_contact_routing); 403 feature_disabled otherwise, except that the value already served sent back ([] without contact routing, on a create too) is accepted and changes nothing. When present, replaces the contact's roles.",
            "items": {
              "type": "string"
            }
          },
          "active": {
            "type": "boolean"
          },
          "opted_out": {
            "type": "boolean"
          }
        },
        "description": "The fields of a contact; the contact as GET serves it can be sent back as read (id, is_primary and factor_opt_outs are read-only and ignored). On the primary contact, active and opted_out cannot be changed: sent with the value served they are ignored, any other value is 422 validation_failed naming the field. On an account without contact people, an update of another contact that sends every field with the value served is a no-op (200, nothing written); any change is 403 feature_disabled."
      },
      "InsuranceContact": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phone_number": {
            "type": "string",
            "nullable": true
          },
          "agency_name": {
            "type": "string",
            "nullable": true
          },
          "active": {
            "type": "boolean"
          }
        }
      },
      "PartyTagRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "PartyCustomFieldValue": {
        "description": "One custom field's value (a party's or a project's), in its field type's shape (one alternative per type; see Custom field types on the parties page). Every type serves name, value and user_id.",
        "anyOf": [
          {
            "title": "String field",
            "x-hounddog-custom-field-type": "string",
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "type": "string",
                "nullable": true,
                "description": "The text."
              },
              "user_id": {
                "type": "integer",
                "nullable": true,
                "enum": [
                  null
                ],
                "description": "Always null on this type."
              }
            }
          },
          {
            "title": "Integer field",
            "x-hounddog-custom-field-type": "integer",
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "type": "string",
                "nullable": true,
                "description": "The whole number as text, such as \"-12\"."
              },
              "user_id": {
                "type": "integer",
                "nullable": true,
                "enum": [
                  null
                ],
                "description": "Always null on this type."
              }
            }
          },
          {
            "title": "User field",
            "x-hounddog-custom-field-type": "user",
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "type": "string",
                "nullable": true,
                "description": "The assigned user's display name; null when no user is assigned."
              },
              "user_id": {
                "type": "integer",
                "nullable": true,
                "description": "The assigned user's id; null when no user is assigned."
              }
            }
          }
        ]
      },
      "PartyProject": {
        "type": "object",
        "description": "compliant / compliant_through / noncompliant under project compliance only; pass_fail on accounts with projects but without project compliance.",
        "properties": {
          "project_id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "compliant": {
            "type": "boolean",
            "nullable": true
          },
          "compliant_through": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "noncompliant": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PartyNoncompliance"
            }
          },
          "pass_fail": {
            "type": "string",
            "enum": [
              "compliant",
              "marked_compliant",
              "not_compliant",
              "no_requirement",
              null
            ],
            "nullable": true
          }
        }
      },
      "CertificateSummary": {
        "type": "object",
        "description": "A summary of one of the party's certificates. document_type, effective_on and expires_on are null until status is Processed, as on the certificate itself.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "status": {
            "type": "string"
          },
          "canceled": {
            "type": "boolean",
            "description": "True when the certificate was invalidated: it stays on file but no longer counts toward compliance."
          },
          "effective_on": {
            "type": "string",
            "format": "date",
            "description": "The earliest effective date among the coverages present. For workers' compensation these are the certificate's own policy dates; a state-fund proof's or a state exemption's own dates are in coverages.wc.fields, and compliance uses those instead only when the party's requirement accepts state-fund proofs or state exemptions. Null until status is Processed.",
            "nullable": true
          },
          "expires_on": {
            "type": "string",
            "format": "date",
            "description": "The earliest expiration date among the coverages present. For workers' compensation these are the certificate's own policy dates; a state-fund proof's or a state exemption's own dates are in coverages.wc.fields, and compliance uses those instead only when the party's requirement accepts state-fund proofs or state exemptions. Null until status is Processed.",
            "nullable": true
          },
          "document_type": {
            "type": "string",
            "description": "What the classifier decided the document is. Null until status is Processed.",
            "nullable": true
          }
        }
      },
      "FactorScore": {
        "type": "object",
        "properties": {
          "score": {
            "type": "integer",
            "nullable": true
          },
          "satisfied": {
            "type": "boolean"
          }
        }
      },
      "PartyRequirements": {
        "type": "object",
        "properties": {
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement enforced against the party directly, the primary first."
          },
          "compliance_profile": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "name": {
                "type": "string"
              }
            },
            "nullable": true
          }
        }
      },
      "OutreachEntry": {
        "type": "object",
        "description": "One reachout the app is running for the party now: who is asked, for what, on which cadence, and how far it has gone.",
        "properties": {
          "factors": {
            "type": "array",
            "description": "What the reachout asks for. The combined entry lists every item the combined email asks for. Empty on a combined entry that is only a status update (every outstanding item is assigned to another contact person).",
            "items": {
              "type": "string",
              "pattern": "^(insurance|w9|signing:[0-9]+)$"
            }
          },
          "recipient": {
            "type": "object",
            "properties": {
              "contact_id": {
                "type": "integer",
                "description": "The party contact; null for an insurance agent.",
                "nullable": true
              },
              "email_address": {
                "type": "string",
                "description": "null for a primary contact with no email address, who is reached by text message.",
                "nullable": true
              },
              "kind": {
                "type": "string",
                "enum": [
                  "primary",
                  "holder",
                  "escalated",
                  "agent"
                ],
                "description": "primary: the primary contact; holder: another contact person who holds a role; escalated: a contact person added because the party did not respond; agent: an insurance agent."
              }
            }
          },
          "cadence": {
            "type": "string",
            "description": "combined for the multi-factor combined email to the main contact; otherwise the factor's own cadence.",
            "enum": [
              "combined",
              "insurance",
              "w9",
              "signing"
            ]
          },
          "position": {
            "type": "object",
            "properties": {
              "count": {
                "type": "integer",
                "description": "Contacts this recipient has received from this cadence."
              },
              "last_sent_at": {
                "type": "string",
                "format": "date-time",
                "description": "The clock the cadence consults before its next send: when the record last sent, or for the combined entry when the combined email last went out; may be set while this recipient's count is 0.",
                "nullable": true
              },
              "limit": {
                "type": "integer",
                "description": "The account's contact limit."
              },
              "exhausted": {
                "type": "boolean",
                "description": "count has reached limit: this cadence sends this recipient nothing more."
              }
            }
          },
          "record": {
            "type": "object",
            "description": "The record behind the reachout; null for the combined entry, whose position is kept on the party.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "compliance_request",
                  "w9",
                  "signing_request"
                ]
              },
              "id": {
                "type": "integer"
              }
            },
            "nullable": true
          },
          "link": {
            "type": "string",
            "description": "The page this recipient was sent to: the request's upload page, the agent's own upload page for an insurance agent, the W-9 request page, or the compliance portal. null for a signing seat. A bearer link: anyone holding it can act as the party on that page. Treat it like a password and never log it.",
            "nullable": true
          }
        }
      },
      "PartyDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Party"
          },
          {
            "type": "object",
            "properties": {
              "requirements": {
                "$ref": "#/components/schemas/PartyRequirements"
              },
              "noncompliant": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PartyNoncompliance"
                }
              },
              "expirations": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PartyExpiration"
                }
              },
              "contacts": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PartyContact"
                }
              },
              "insurance_contacts": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/InsuranceContact"
                }
              },
              "insurance_contact_name": {
                "type": "string",
                "nullable": true
              },
              "insurance_contact_email": {
                "type": "string",
                "nullable": true
              },
              "insurance_contact_phone": {
                "type": "string",
                "nullable": true
              },
              "insurance_agency_name": {
                "type": "string",
                "nullable": true
              },
              "tags": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PartyTagRef"
                }
              },
              "projects": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PartyProject"
                }
              },
              "certificates": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/CertificateSummary"
                }
              },
              "notes": {
                "type": "string",
                "nullable": true
              },
              "note_to_party": {
                "type": "string",
                "nullable": true
              },
              "archive_date": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "started_in_compliance": {
                "type": "boolean",
                "nullable": true
              },
              "manual_expiration_date": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "collect_initial_w9": {
                "type": "boolean",
                "nullable": true
              },
              "compliance_score": {
                "type": "integer",
                "nullable": true
              },
              "factor_scores": {
                "type": "object",
                "properties": {},
                "additionalProperties": {
                  "$ref": "#/components/schemas/FactorScore"
                }
              },
              "portal_url": {
                "type": "string",
                "description": "The party's multi-factor compliance portal; null on accounts without multi-factor compliance. A bearer link: anyone holding it can act as the party on that page. Treat it like a password and never log it.",
                "nullable": true
              },
              "outreach": {
                "type": "array",
                "description": "Every active reachout for the party, one entry per recipient of each open request. Empty when nothing is being asked.",
                "items": {
                  "$ref": "#/components/schemas/OutreachEntry"
                }
              },
              "links": {
                "type": "object",
                "description": "Related API paths.",
                "properties": {},
                "additionalProperties": {
                  "type": "string"
                }
              }
            }
          }
        ],
        "description": "The party detail entity."
      },
      "PartyProjectWrite": {
        "type": "object",
        "required": [
          "project_id"
        ],
        "properties": {
          "project_id": {
            "type": "integer"
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true,
            "description": "This party's own requirement on the project. Writable only on accounts with project compliance and project-specific requirements, where an omitted or null value clears it. Elsewhere it is never changed: an omitted key, or the link's stored value sent back unchanged (null included; null for a new link), is accepted as a no-op, so a GET's projects can be sent back as read; any other value is 403 feature_disabled (details names projects[].insurance_requirement_id)."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true,
            "description": "This party's own compliance profile on the project (multi-factor compliance). Writable only on accounts with multi-factor compliance, project compliance and project-specific requirements, where an omitted or null value clears it. Elsewhere it is never changed: an omitted key, or the link's stored value sent back unchanged (null included; null for a new link), is accepted as a no-op; any other value is 403 feature_disabled (details names projects[].compliance_profile_id). An archived profile is 422 unless it is already the link's."
          }
        }
      },
      "CustomFieldWrite": {
        "description": "value, or user_id for a User-type field. The entry as the party or project entity serves it is accepted too: its name is ignored; on a field that takes value, a user_id of null is ignored; on a User-type field, alongside user_id, a value that is null, the value served for the field or the display name of the user sent is ignored. Any other combination is 422 naming custom_fields. The members each field type takes are its alternative below (see Custom field types on the parties page).",
        "anyOf": [
          {
            "title": "String field",
            "x-hounddog-custom-field-type": "string",
            "type": "object",
            "properties": {
              "value": {
                "anyOf": [
                  {
                    "type": "string",
                    "nullable": true
                  },
                  {
                    "type": "number",
                    "nullable": true
                  }
                ],
                "description": "The value as text. A JSON number is also accepted and stored as its plain decimal text; null, or a blank or whitespace-only string, clears the value (blank means no value)."
              },
              "user_id": {
                "type": "integer",
                "nullable": true,
                "enum": [
                  null
                ],
                "description": "Accepted only as null (the member as served); anything else is 422 naming custom_fields."
              }
            }
          },
          {
            "title": "Integer field",
            "x-hounddog-custom-field-type": "integer",
            "type": "object",
            "properties": {
              "value": {
                "anyOf": [
                  {
                    "type": "string",
                    "nullable": true
                  },
                  {
                    "type": "integer",
                    "nullable": true
                  }
                ],
                "description": "A whole number (digits with an optional leading minus sign), as text (\"-12\") or as a JSON integer (-12); spaces around it are removed. A number with a decimal point (12.5, 12.0) or any other text is 422 naming custom_fields; null, or a blank or whitespace-only string, clears the value (blank means no value)."
              },
              "user_id": {
                "type": "integer",
                "nullable": true,
                "enum": [
                  null
                ],
                "description": "Accepted only as null (the member as served); anything else is 422 naming custom_fields."
              }
            }
          },
          {
            "title": "User field",
            "x-hounddog-custom-field-type": "user",
            "type": "object",
            "properties": {
              "user_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "nullable": true
                  },
                  {
                    "type": "string",
                    "nullable": true
                  }
                ],
                "description": "The id of one of the account's assignable users (a string of digits is also accepted); null, or a blank or whitespace-only string, clears the field (blank means no value)."
              },
              "value": {
                "type": "string",
                "nullable": true,
                "description": "Optional, the member as served: ignored when it is null, the value served for the field or the display name of the user sent; any other value is 422 naming custom_fields."
              }
            }
          }
        ]
      },
      "PartyCreate": {
        "type": "object",
        "description": "Feature-gated fields: tags (tags), custom_fields (custom fields), projects (projects), note_to_party (party notes), address, address2, city, state and postal_code (enable_editing_of_vendor_addresses), archive_date (enable_auto_archive), compliance_profile_id (enable_multi_factor_compliance), collect_initial_w9 (enable_w9_collection; create only). A gated field on an account without the feature is 403 feature_disabled naming the feature, unless it is sent empty (null, a blank string, [], {}, or false for an on/off field): that is accepted and ignored.",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "email_address": {
            "type": "string"
          },
          "contact_first_name": {
            "type": "string"
          },
          "contact_last_name": {
            "type": "string"
          },
          "phone_number": {
            "type": "string"
          },
          "address": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "address2": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "city": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "state": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "postal_code": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "external_id": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "note_to_party": {
            "type": "string"
          },
          "archive_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "string",
                "format": "date-time"
              }
            ],
            "description": "Needs enable_auto_archive; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing. A date (2027-03-10) or a timestamp in any offset (2027-03-11T04:30:00Z), stored as the start of its US Central day. On an update, the value served sent back is not written: a timestamp of the same instant in any offset, or the stored time's US Central date. A timestamp without an offset is read in US Central."
          },
          "started_in_compliance": {
            "type": "boolean"
          },
          "manual_expiration_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "string",
                "format": "date-time"
              }
            ],
            "description": "A date (2027-03-10) or a timestamp, stored as the start of its US Central day; a timestamp without an offset is read in US Central."
          },
          "collect_initial_w9": {
            "type": "boolean"
          },
          "insurance_contact_name": {
            "type": "string"
          },
          "insurance_contact_email": {
            "type": "string"
          },
          "insurance_contact_phone": {
            "type": "string"
          },
          "insurance_agency_name": {
            "type": "string"
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement enforced against the party, as requirements.insurance_requirement_ids serves them; a present key replaces the set and the first id becomes requirements.insurance_requirement_id. Needs enable_multiple_insurance_requirements; 403 feature_disabled otherwise, except that the value already served sent back is accepted and changes nothing. Cannot be sent with insurance_requirement_id."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "object",
                  "description": "A tag as the party entity serves it; only id is read, name is ignored.",
                  "required": [
                    "id"
                  ],
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "description": "Tag type ids, or tags as the party entity serves them ({\"id\": 5, \"name\": \"Electrical\"}): from an object only id is read, and a name that differs from the tag's name is ignored. A present key replaces the set."
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id, written as a patch: a key sent is written, a key omitted is left as it is, and a key sent as null (or with a null or blank value or user_id) clears that field (clearing a field that has no value changes nothing). {} and null change nothing. Only active fields available on parties are accepted; any other key, an archived field's included, is 422 naming custom_fields.",
            "properties": {},
            "additionalProperties": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/CustomFieldWrite"
                }
              ],
              "nullable": true
            },
            "nullable": true
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PartyProjectWrite"
            },
            "description": "A present key replaces the set."
          }
        }
      },
      "PartyUpdate": {
        "type": "object",
        "description": "Feature-gated fields: tags (tags), custom_fields (custom fields), projects (projects), note_to_party (party notes), address, address2, city, state and postal_code (enable_editing_of_vendor_addresses), archive_date (enable_auto_archive), compliance_profile_id (enable_multi_factor_compliance), collect_initial_w9 (enable_w9_collection; create only). A gated field on an account without the feature is 403 feature_disabled naming the feature, unless it is sent with the value the API serves for the party (null and an empty string counting as equal): that is accepted and changes nothing, so a GET body can be sent back as read. collect_initial_w9, started_in_compliance and manual_expiration_date apply on create only and are ignored on PATCH. The whole party entity a GET serves can be sent back as read and changes nothing: members the write does not take (status, requirements, noncompliant, expirations, contacts, insurance_contacts, certificates, outreach, links and the other read-only members) are ignored, tags may be sent as served objects, and a custom field entry may carry the member the write does not take as served.",
        "properties": {
          "name": {
            "type": "string"
          },
          "email_address": {
            "type": "string"
          },
          "contact_first_name": {
            "type": "string"
          },
          "contact_last_name": {
            "type": "string"
          },
          "phone_number": {
            "type": "string"
          },
          "address": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "address2": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "city": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "state": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "postal_code": {
            "type": "string",
            "description": "Needs enable_editing_of_vendor_addresses; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing."
          },
          "external_id": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "note_to_party": {
            "type": "string"
          },
          "archive_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "string",
                "format": "date-time"
              }
            ],
            "description": "Needs enable_auto_archive; 403 feature_disabled otherwise, except that the value already served sent back (null and an empty string counting as equal), or any empty value on a create, is accepted and changes nothing. A date (2027-03-10) or a timestamp in any offset (2027-03-11T04:30:00Z), stored as the start of its US Central day. On an update, the value served sent back is not written: a timestamp of the same instant in any offset, or the stored time's US Central date. A timestamp without an offset is read in US Central."
          },
          "insurance_contact_name": {
            "type": "string"
          },
          "insurance_contact_email": {
            "type": "string"
          },
          "insurance_contact_phone": {
            "type": "string"
          },
          "insurance_agency_name": {
            "type": "string"
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement enforced against the party, as requirements.insurance_requirement_ids serves them; a present key replaces the set and the first id becomes requirements.insurance_requirement_id. Needs enable_multiple_insurance_requirements; 403 feature_disabled otherwise, except that the value already served sent back is accepted and changes nothing. Cannot be sent with insurance_requirement_id."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "object",
                  "description": "A tag as the party entity serves it; only id is read, name is ignored.",
                  "required": [
                    "id"
                  ],
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "description": "Tag type ids, or tags as the party entity serves them ({\"id\": 5, \"name\": \"Electrical\"}): from an object only id is read, and a name that differs from the tag's name is ignored. A present key replaces the set."
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id, written as a patch: a key sent is written, a key omitted is left as it is, and a key sent as null (or with a null or blank value or user_id) clears that field (clearing a field that has no value changes nothing). {} and null change nothing. Only active fields available on parties are accepted; any other key, an archived field's included, is 422 naming custom_fields.",
            "properties": {},
            "additionalProperties": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/CustomFieldWrite"
                }
              ],
              "nullable": true
            },
            "nullable": true
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PartyProjectWrite"
            },
            "description": "A present key replaces the set."
          }
        }
      },
      "SendReminder": {
        "type": "object",
        "description": "Each refusal is 422 validation_failed: the party is already compliant or has no open request; project_id missing on a project-compliance account or not in your account (a body field, never 404); and, for the combined reminder, the dashboard's refusals, reworded without the party name (nothing outstanding, the address suppressed by Email Health, a reminder sent within the last hour, no email address, every item assigned to other contact people or awaiting a renewal request) with its message.",
        "properties": {
          "project_id": {
            "type": "integer"
          },
          "recipient_type": {
            "type": "string",
            "enum": [
              "party_only",
              "insurance_only",
              "both"
            ],
            "default": "party_only"
          }
        }
      },
      "Address": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "type": "string",
            "nullable": true
          },
          "zip": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "InsuredAddress": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "address2": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "type": "string",
            "nullable": true
          },
          "zip": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "Coverage": {
        "type": "object",
        "description": "One coverage on a certificate. Every coverage type has this shape, whatever its prefix. An entry exists for every coverage type whose `<prefix>_present` box is checked on the certificate or that has any recorded value; `present` mirrors the box, so an entry with `present: false` can exist when values were recorded with the box unchecked; a type with neither has no entry.",
        "required": [
          "present"
        ],
        "properties": {
          "present": {
            "type": "boolean",
            "description": "Mirrors the certificate's `<prefix>_present` box."
          },
          "policy_number": {
            "type": "string",
            "nullable": true
          },
          "effective": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "The coverage's own policy effective date. For wc, a state exemption's own effective date is in fields (state_exemption_eff_date); compliance uses it instead only when the party's requirement accepts state exemptions."
          },
          "expiration": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "The coverage's own policy expiration date. For wc, a state-fund proof's or a state exemption's own expiration is in fields (monopolistic_exp_date, state_exemption_exp_date); compliance uses it instead only when the party's requirement accepts state-fund proofs or state exemptions."
          },
          "additional_insured": {
            "type": "boolean",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "nullable": true
          },
          "limits": {
            "type": "object",
            "description": "Each key is the stored column name with <prefix>_ removed and then every leading liability_, limits_ or limit_ segment removed, repeatedly (so auto_liability_limits_combined_single is combined_single and auto_liability_limits_custom_limit is custom_limit, gl_limits_each_occurance is each_occurance, umb_limits_each_occurrence is each_occurrence, re_limit_coverage is coverage, ab_occurrence_limit is occurrence_limit, since a trailing _limit is kept); values are the stored strings, except the workers' compensation statutory boxes per_statute and other, which are booleans. A `custom_name` key is the label of a custom limit, a stored string. `certificate_key` names where the compared certificate value lives in `coverages.<prefix>`: `present`, `additional_insured` and `subrogation_waiver` at the entry's top level; the limit amounts in `limits` (every column whose name contains `limit`, except the General Liability `general_aggregate_limit_applies_*` boxes); everything else in `fields` (the type's other certificate fields, the GL aggregate-applies boxes and `ab_included` among them).",
            "properties": {},
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string",
                  "nullable": true
                },
                {
                  "type": "boolean"
                }
              ]
            }
          },
          "fields": {
            "type": "object",
            "description": "The coverage type's other recorded values, keyed by certificate key, for example a deductible. For General Liability they include, among others, general_aggregate_limit_applies_per_policy, general_aggregate_limit_applies_per_project, general_aggregate_limit_applies_per_location and general_aggregate_limit_applies_other (booleans), general_aggregate_limit_applies_other_text (a string), ab_included (the policy includes Assault & Battery coverage), primary_non_contributory, coverage_trigger_occurance, coverage_trigger_claims_made, ll_endorsement and pool_pop_up_endorsement (booleans); for Workers Compensation, for example primary_non_contributory and exclusions (booleans). Omitted when the type has none. `certificate_key` names where the compared certificate value lives in `coverages.<prefix>`: `present`, `additional_insured` and `subrogation_waiver` at the entry's top level; the limit amounts in `limits` (every column whose name contains `limit`, except the General Liability `general_aggregate_limit_applies_*` boxes); everything else in `fields` (the type's other certificate fields, the GL aggregate-applies boxes and `ab_included` among them). For Workers Compensation they also include the state exemption values and, for a state-fund (monopolistic) proof, monopolistic_proof (boolean), monopolistic_jurisdiction (a state code) and monopolistic_exp_date (an ISO date).",
            "properties": {},
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string",
                  "nullable": true
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            }
          }
        }
      },
      "Certificate": {
        "type": "object",
        "description": "A certificate. The parsed members (document_type, effective_on, expires_on, certificate_date, holder, producer, insured, coverages) are null until status is Processed; status, intake_status, canceled and the download are always served.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer",
            "description": "null for a certificate uploaded through the universal upload form and still unassigned to a party.",
            "nullable": true
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "document_type": {
            "type": "string",
            "description": "What the classifier decided the document is (for example CERTIFICATE_OF_LIABILITY_INSURANCE). Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "The certificate's review state as stored: Pending (received, awaiting processing or review), Processed, Rejected; see intake_status for the review progress.",
            "enum": [
              "Pending",
              "Processed",
              "Rejected"
            ]
          },
          "intake_status": {
            "type": "string",
            "enum": [
              "processing",
              "queued",
              "done"
            ]
          },
          "canceled": {
            "type": "boolean"
          },
          "canceled_by": {
            "type": "string",
            "nullable": true
          },
          "canceled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "effective_on": {
            "type": "string",
            "format": "date",
            "description": "The earliest effective date among the coverages present. For workers' compensation these are the certificate's own policy dates; a state-fund proof's or a state exemption's own dates are in coverages.wc.fields, and compliance uses those instead only when the party's requirement accepts state-fund proofs or state exemptions. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true
          },
          "expires_on": {
            "type": "string",
            "format": "date",
            "description": "The earliest expiration date among the coverages present. For workers' compensation these are the certificate's own policy dates; a state-fund proof's or a state exemption's own dates are in coverages.wc.fields, and compliance uses those instead only when the party's requirement accepts state-fund proofs or state exemptions. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true
          },
          "certificate_date": {
            "type": "string",
            "format": "date",
            "description": "The date printed on the certificate. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true
          },
          "holder": {
            "description": "The certificate holder. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/Address"
              }
            ]
          },
          "producer": {
            "description": "The producer (agency). Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/Address"
              }
            ]
          },
          "insured": {
            "description": "The insured. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/InsuredAddress"
              }
            ]
          },
          "coverages": {
            "type": "object",
            "description": "One map keyed by coverage prefix, each entry the same shape. An entry exists for every coverage type whose `<prefix>_present` box is checked on the certificate or that has any recorded value; `present` mirrors the box, so an entry with `present: false` can exist when values were recorded with the box unchecked; a type with neither has no entry. The set of coverage types can grow: discover it with GET /coverage_types and treat an unknown prefix like any other. Null until status is Processed (parsed data is served once the certificate is processed: after intake has reviewed it, or when the pipeline automatically processes a state-fund workers' compensation proof or a person converts one).",
            "nullable": true,
            "properties": {
              "gl": {
                "$ref": "#/components/schemas/Coverage"
              },
              "auto": {
                "$ref": "#/components/schemas/Coverage"
              },
              "wc": {
                "$ref": "#/components/schemas/Coverage"
              },
              "umb": {
                "$ref": "#/components/schemas/Coverage"
              },
              "pl": {
                "$ref": "#/components/schemas/Coverage"
              },
              "im": {
                "$ref": "#/components/schemas/Coverage"
              },
              "gk": {
                "$ref": "#/components/schemas/Coverage"
              },
              "cg": {
                "$ref": "#/components/schemas/Coverage"
              },
              "oh": {
                "$ref": "#/components/schemas/Coverage"
              },
              "pollution": {
                "$ref": "#/components/schemas/Coverage"
              },
              "re": {
                "$ref": "#/components/schemas/Coverage"
              },
              "ava": {
                "$ref": "#/components/schemas/Coverage"
              },
              "db": {
                "$ref": "#/components/schemas/Coverage"
              },
              "pa": {
                "$ref": "#/components/schemas/Coverage"
              },
              "br": {
                "$ref": "#/components/schemas/Coverage"
              },
              "ti": {
                "$ref": "#/components/schemas/Coverage"
              },
              "cl": {
                "$ref": "#/components/schemas/Coverage"
              },
              "am": {
                "$ref": "#/components/schemas/Coverage"
              },
              "ab": {
                "$ref": "#/components/schemas/Coverage"
              }
            },
            "additionalProperties": {
              "description": "A coverage type from GET /coverage_types.",
              "allOf": [
                {
                  "$ref": "#/components/schemas/Coverage"
                }
              ]
            }
          },
          "uploaded_by_party": {
            "type": "boolean",
            "nullable": true
          },
          "uploaded_by_agent": {
            "type": "boolean",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "links": {
            "type": "object",
            "description": "Related API paths.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "CertificateCreate": {
        "type": "object",
        "description": "Send file or direct_upload_token, not both.",
        "required": [
          "party_id"
        ],
        "properties": {
          "party_id": {
            "type": "integer"
          },
          "file": {
            "type": "string",
            "format": "binary"
          },
          "direct_upload_token": {
            "type": "string"
          },
          "project_id": {
            "type": "integer"
          }
        }
      },
      "DirectUploadRequest": {
        "type": "object",
        "required": [
          "filename"
        ],
        "properties": {
          "filename": {
            "type": "string"
          },
          "content_type": {
            "type": "string"
          }
        }
      },
      "DirectUpload": {
        "type": "object",
        "required": [
          "url",
          "fields",
          "direct_upload_token",
          "expires_at"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "fields": {
            "type": "object",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          },
          "direct_upload_token": {
            "type": "string"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ApprovalOverride": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "coverage_prefix": {
            "type": "string",
            "nullable": true
          },
          "factor_type": {
            "type": "string",
            "enum": [
              "insurance",
              "w9",
              "document_signing",
              null
            ],
            "nullable": true
          },
          "signing_template_id": {
            "type": "integer",
            "nullable": true
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "end_date": {
            "type": "string",
            "format": "date-time",
            "description": "Stored as a time: a date sent on write is the start of that day, US Central time. null for no end.",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "revoked": {
            "type": "boolean"
          },
          "active": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ApprovalOverrideWrite": {
        "type": "object",
        "properties": {
          "coverage_prefix": {
            "type": "string",
            "nullable": true
          },
          "factor_type": {
            "type": "string",
            "enum": [
              "insurance",
              "w9",
              "document_signing",
              null
            ],
            "nullable": true,
            "description": "Needs enable_multi_factor_compliance; 403 feature_disabled naming the field otherwise, except that null (the value the API serves there) is accepted and changes nothing. Without multi-factor compliance a blank string counts as null; under it a blank string is 400 validation_failed (send null for no value)."
          },
          "signing_template_id": {
            "type": "integer",
            "nullable": true,
            "description": "Needs enable_multi_factor_compliance; 403 feature_disabled naming the field otherwise, except that null (the value the API serves there) is accepted and changes nothing. Without multi-factor compliance a blank string counts as null; under it a blank string is 400 validation_failed (send null for no value)."
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "end_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date",
                "nullable": true
              },
              {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            ],
            "description": "The date the override lapses (the start of that day, US Central time); null for no end. A date (2027-03-10) or a timestamp in any offset (2027-03-11T04:30:00Z), stored as the start of its US Central day. On an update, the value served sent back is not written: a timestamp of the same instant in any offset, or the stored time's US Central date. A timestamp without an offset is read in US Central."
          },
          "notes": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ComplianceRequestAgent": {
        "type": "object",
        "properties": {
          "entered": {
            "type": "boolean"
          },
          "parallel": {
            "type": "boolean"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "email_request_count": {
            "type": "integer",
            "nullable": true
          },
          "email_last_sent": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "source": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ComplianceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "completed": {
            "type": "boolean"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "unresponsive": {
            "type": "boolean"
          },
          "email_request_count": {
            "type": "integer",
            "nullable": true
          },
          "email_last_sent": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "sms_request_count": {
            "type": "integer",
            "nullable": true,
            "description": "Served for compatibility; always 0. On an account that sends text messages, a reminder text sent on a cycle advances email_request_count and email_last_sent."
          },
          "sms_last_sent": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Served for compatibility; always null. On an account that sends text messages, a reminder text sent on a cycle advances email_request_count and email_last_sent."
          },
          "review_needed": {
            "type": "boolean",
            "nullable": true
          },
          "review_failed": {
            "type": "boolean",
            "nullable": true
          },
          "agent": {
            "$ref": "#/components/schemas/ComplianceRequestAgent"
          },
          "upload_url": {
            "type": "string",
            "description": "The vendor's upload page for this request, the same link its insurance outreach entries show. A bearer link: anyone holding it can upload a certificate for the party. Treat it like a password and never log it."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "InsuranceRequirement": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "default": {
            "type": "boolean"
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "description_of_operations": {
            "type": "string",
            "nullable": true
          },
          "additional_insured_name": {
            "type": "string",
            "nullable": true
          },
          "individual": {
            "type": "boolean"
          },
          "coverages": {
            "$ref": "#/components/schemas/RequirementCoverages"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "InsuranceRequirementCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "default": {
            "type": "boolean",
            "description": "true makes this the only default among the account's non-individual requirements (the individuals default is untouched)."
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "description_of_operations": {
            "type": "string",
            "nullable": true
          },
          "additional_insured_name": {
            "type": "string",
            "nullable": true
          },
          "coverages": {
            "$ref": "#/components/schemas/RequirementCoverages"
          }
        }
      },
      "InsuranceRequirementUpdate": {
        "type": "object",
        "description": "Every field optional; send only what changes.",
        "properties": {
          "name": {
            "type": "string",
            "description": "On a JobTread-connected account a rename is refused with 422 (contact HoundDog support)."
          },
          "default": {
            "type": "boolean",
            "description": "true makes this the only default among the account's non-individual requirements (the individuals default is untouched)."
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "description_of_operations": {
            "type": "string",
            "nullable": true
          },
          "additional_insured_name": {
            "type": "string",
            "nullable": true
          },
          "coverages": {
            "$ref": "#/components/schemas/RequirementCoverages"
          }
        }
      },
      "CoverageRequirementGl": {
        "type": "object",
        "description": "The requirement fields of General Liability (gl): each key is the stored requirement column with its gl_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "General Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "additional_insured_exted_to_completed": {
            "type": "boolean",
            "description": "Additional Insured Extends to Completed Operations Coverage. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "coverage_trigger_claims_made": {
            "type": "boolean",
            "description": "General Liability Coverage Trigger: Claims-Made. Comparison: required.",
            "nullable": true
          },
          "coverage_trigger_occurance": {
            "type": "boolean",
            "description": "General Liability Coverage Trigger: Occurrence. Comparison: required.",
            "nullable": true
          },
          "damage_to_rented_premises_minimum": {
            "type": "integer",
            "description": "Damage to Rented Premises Limit. Comparison: greater.",
            "nullable": true
          },
          "general_aggregate_limit_applies_per_location": {
            "type": "boolean",
            "description": "General Aggregate Limit Applies Per Location. Comparison: required.",
            "nullable": true
          },
          "general_aggregate_limit_applies_per_policy": {
            "type": "boolean",
            "description": "General Aggregate Limit Applies Per Policy. Comparison: required.",
            "nullable": true
          },
          "general_aggregate_limit_applies_per_project": {
            "type": "boolean",
            "description": "General Aggregate Limit Applies Per Project. Comparison: required.",
            "nullable": true
          },
          "general_aggregate_minimum": {
            "type": "integer",
            "description": "General Aggregate Limit. Comparison: greater.",
            "nullable": true
          },
          "ll_endorsement": {
            "type": "boolean",
            "description": "Liquor Liability Endorsement. Comparison: required.",
            "nullable": true
          },
          "medical_expenses_per_person_minimum": {
            "type": "integer",
            "description": "Medical Expenses Per Person limit. Comparison: greater.",
            "nullable": true
          },
          "per_occurance_minimum": {
            "type": "integer",
            "description": "Per Occurrence Limit. Comparison: greater.",
            "nullable": true
          },
          "personal_advertising_injury_minimum": {
            "type": "integer",
            "description": "Personal and Advertising Injury Limit. Comparison: greater.",
            "nullable": true
          },
          "pool_pop_up_endorsement": {
            "type": "boolean",
            "description": "Pool Pop-up Endorsement. Comparison: required.",
            "nullable": true
          },
          "primary_non_contributory": {
            "type": "boolean",
            "description": "Primary & Noncontributory Endorsements. Comparison: required.",
            "nullable": true
          },
          "products_completed_operations_minimum": {
            "type": "integer",
            "description": "Products-Completed Operations Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "rl_occurrence_limit": {
            "type": "integer",
            "description": "Riggers Liability Coverage. Comparison: greater.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementAuto": {
        "type": "object",
        "description": "The requirement fields of Automobile Liability (auto): each key is the stored requirement column with its auto_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Auto Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "applies_to_any": {
            "type": "boolean",
            "description": "Any Auto Coverage. Comparison: custom.",
            "nullable": true
          },
          "applies_to_hired_only": {
            "type": "boolean",
            "description": "Hired Auto Coverage. Comparison: custom.",
            "nullable": true
          },
          "applies_to_non_owned_only": {
            "type": "boolean",
            "description": "Non-Owned Auto Coverage. Comparison: custom.",
            "nullable": true
          },
          "applies_to_owned_only": {
            "type": "boolean",
            "description": "Owned Auto Coverage. Comparison: custom.",
            "nullable": true
          },
          "applies_to_scheduled": {
            "type": "boolean",
            "description": "Scheduled Auto Coverage. Comparison: custom.",
            "nullable": true
          },
          "bodily_injury_per_accident_minimum": {
            "type": "integer",
            "description": "Bodily Injury Per Accident Limit. Comparison: greater.",
            "nullable": true
          },
          "bodily_injury_per_person_minimum": {
            "type": "integer",
            "description": "Bodily Injury Per Person Limit. Comparison: greater.",
            "nullable": true
          },
          "each_occurance_minimum": {
            "type": "integer",
            "description": "Combined Single Limits - Each Occurrence Limit. Comparison: custom.",
            "nullable": true
          },
          "hired_auto_physical_damage_limit": {
            "type": "integer",
            "description": "Hired Auto Physical Damage Limit. Comparison: greater.",
            "nullable": true
          },
          "medical_payments_minimum": {
            "type": "integer",
            "description": "Medical Payments Limit. Comparison: greater.",
            "nullable": true
          },
          "primary_non_contributory": {
            "type": "boolean",
            "description": "Primary & Noncontributory Endorsements. Comparison: required.",
            "nullable": true
          },
          "property_damage_per_accident_minimum": {
            "type": "integer",
            "description": "Property Damage Per Accident. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          },
          "type_accept_any_checked": {
            "type": "boolean",
            "description": "Type accept any checked. Comparison: setting.",
            "nullable": true
          },
          "uninsured_motorist_minimum": {
            "type": "integer",
            "description": "Uninsured Motorist Coverage. Comparison: greater.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementWc": {
        "type": "object",
        "description": "The requirement fields of Workers Compensation (wc): each key is the stored requirement column with its wc_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Workers Comp/Employer's Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "accept_competitive_state_fund": {
            "type": "boolean",
            "description": "Accept competitive state fund. Comparison: setting.",
            "nullable": true
          },
          "accept_monopolistic_proof": {
            "type": "boolean",
            "description": "Accept monopolistic proof. Comparison: setting.",
            "nullable": true
          },
          "accept_state_exemption": {
            "type": "boolean",
            "description": "Accept state exemption. Comparison: setting.",
            "nullable": true
          },
          "employers_liability_disease_each_employee_minimum": {
            "type": "integer",
            "description": "E.L. - Disease Each Employee Limit. Comparison: greater.",
            "nullable": true
          },
          "employers_liability_disease_policy_minimum": {
            "type": "integer",
            "description": "E.L. - Disease Policy Limit. Comparison: greater.",
            "nullable": true
          },
          "employers_liability_each_accident_minimum": {
            "type": "integer",
            "description": "E.L. - Each Accident Limit. Comparison: greater.",
            "nullable": true
          },
          "no_owner_exclusions": {
            "type": "boolean",
            "description": "No Owner/Executive Exclusions. Comparison: forbidden.",
            "nullable": true
          },
          "primary_non_contributory": {
            "type": "boolean",
            "description": "E.L. - Primary & Noncontributory Endorsements. Comparison: required.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "statutory_limits": {
            "type": "boolean",
            "description": "Workers Comp Coverage - Per Statute. Comparison: required.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "E.L. - Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementUmb": {
        "type": "object",
        "description": "The requirement fields of Umbrella (umb): each key is the stored requirement column with its umb_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Umbrella/Excess Liability. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_minimum": {
            "type": "integer",
            "description": "Aggregate Limit. Comparison: greater.",
            "nullable": true
          },
          "claims_made": {
            "type": "boolean",
            "description": "Claims Made Trigger. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "deductable": {
            "type": "boolean",
            "description": "Deductible. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "deductable_retention_amount_maximum": {
            "type": "integer",
            "description": "Retention/Deductible Amount. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "each_occurrence_minimum": {
            "type": "integer",
            "description": "Each Occurrence Limit. Comparison: greater.",
            "nullable": true
          },
          "excess_liability": {
            "type": "boolean",
            "description": "Excess Liability Coverage. Comparison: required.",
            "nullable": true
          },
          "occurance": {
            "type": "boolean",
            "description": "Each Occurrence Trigger. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "retention": {
            "type": "boolean",
            "description": "Retention. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          },
          "umbrella_liability": {
            "type": "boolean",
            "description": "Umbrella Coverage. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementPl": {
        "type": "object",
        "description": "The requirement fields of Professional Liability (pl): each key is the stored requirement column with its pl_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Professional Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_minimum": {
            "type": "integer",
            "description": "Aggregate Limit. Comparison: greater.",
            "nullable": true
          },
          "coverage_trigger_claims_made": {
            "type": "boolean",
            "description": "Coverage Trigger: Claims-Made. Comparison: required.",
            "nullable": true
          },
          "coverage_trigger_occurance": {
            "type": "boolean",
            "description": "Coverage Trigger: Occurrence. Comparison: required.",
            "nullable": true
          },
          "per_occurance_minimum": {
            "type": "integer",
            "description": "Each Occurrence Limit. Comparison: greater.",
            "nullable": true
          },
          "primary_non_contributory": {
            "type": "boolean",
            "description": "Primary & Noncontributory Endorsements. Comparison: required.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementIm": {
        "type": "object",
        "description": "The requirement fields of Inland Marine (im): each key is the stored requirement column with its im_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Inland Marine Coverage. Comparison: present.",
            "nullable": true
          },
          "equipment_coverage_minimum": {
            "type": "integer",
            "description": "Equipment Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "loss_payee_address": {
            "type": "string",
            "description": "Loss Payee Address. Comparison: matches.",
            "nullable": true
          },
          "loss_payee_email": {
            "type": "string",
            "description": "Loss Payee Email. Comparison: matches.",
            "nullable": true
          },
          "loss_payee_name": {
            "type": "string",
            "description": "Loss Payee Name. Comparison: matches.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementGk": {
        "type": "object",
        "description": "The requirement fields of Garage Keeper's (gk): each key is the stored requirement column with its gk_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Garage Keeper's Coverage. Comparison: present.",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementCg": {
        "type": "object",
        "description": "The requirement fields of Cargo (cg): each key is the stored requirement column with its cg_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Cargo Coverage. Comparison: present.",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementOh": {
        "type": "object",
        "description": "The requirement fields of On-Hook (oh): each key is the stored requirement column with its oh_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "On-Hook Coverage. Comparison: present.",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementPollution": {
        "type": "object",
        "description": "The requirement fields of Pollution (pollution): each key is the stored requirement column with its pollution_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Pollution Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementRe": {
        "type": "object",
        "description": "The requirement fields of Rental Equipment Coverage (re): each key is the stored requirement column with its re_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Rental Equipment Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "certificate_holder_loss_payee": {
            "type": "boolean",
            "description": "Certificate Holder Loss Payee. Comparison: required.",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementAva": {
        "type": "object",
        "description": "The requirement fields of Aviation Liability Coverage (ava): each key is the stored requirement column with its ava_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Aviation Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementDb": {
        "type": "object",
        "description": "The requirement fields of Data Breach Liability Coverage (db): each key is the stored requirement column with its db_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Data Breach Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementPa": {
        "type": "object",
        "description": "The requirement fields of Personal Auto (pa): each key is the stored requirement column with its pa_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Personal Auto Coverage. Comparison: present.",
            "nullable": true
          },
          "bodily_injury_per_accident_minimum": {
            "type": "integer",
            "description": "Bodily Injury Per Accident Minimum. Comparison: greater.",
            "nullable": true
          },
          "bodily_injury_per_person_minimum": {
            "type": "integer",
            "description": "Bodily Injury Per Person Minimum. Comparison: greater.",
            "nullable": true
          },
          "combined_single_limit_minimum": {
            "type": "integer",
            "description": "Combined Single Limits - Each Occurrence Limit. Comparison: greater.",
            "nullable": true
          },
          "extended_non_owned_endorsement": {
            "type": "boolean",
            "description": "Extended Non-Owned Coverage for Named Individuals Endorsement. Comparison: required.",
            "nullable": true
          },
          "property_damage_per_accident_minimum": {
            "type": "integer",
            "description": "Property Damange Coverage Minimum. Comparison: greater.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementBr": {
        "type": "object",
        "description": "The requirement fields of Builder's Risk (br): each key is the stored requirement column with its br_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Buider's Risk Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementTi": {
        "type": "object",
        "description": "The requirement fields of Trailer Interchange / Non-Owned Trailer Coverage (ti): each key is the stored requirement column with its ti_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Trailer Interchange / Non-Owned Trailer Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional insured. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          },
          "coverage_limit_minimum": {
            "type": "integer",
            "description": "Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "deductible_maximum": {
            "type": "integer",
            "description": "Deductible. Comparison: lesser.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation waiver. Comparison: none (recorded on the requirement; the compliance engine does not check it).",
            "nullable": true
          }
        }
      },
      "CoverageRequirementCl": {
        "type": "object",
        "description": "The requirement fields of Cyber Liability (cl): each key is the stored requirement column with its cl_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Cyber Liability Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementAm": {
        "type": "object",
        "description": "The requirement fields of A&M Coverage (am): each key is the stored requirement column with its am_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "A&M Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "aggregate_limit_minimum": {
            "type": "integer",
            "description": "Aggregate Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Occurrence Coverage Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CoverageRequirementAb": {
        "type": "object",
        "description": "The requirement fields of Assault & Battery (ab): each key is the stored requirement column with its ab_ prefix removed. Comparisons as GET /coverage_types reports them.",
        "additionalProperties": false,
        "properties": {
          "required": {
            "type": "boolean",
            "description": "Assault & Battery Coverage. Comparison: present.",
            "nullable": true
          },
          "additional_insured": {
            "type": "boolean",
            "description": "Additional Insured Endorsement. Comparison: required.",
            "nullable": true
          },
          "occurrence_limit_minimum": {
            "type": "integer",
            "description": "Per Occurrence Limit. Comparison: greater.",
            "nullable": true
          },
          "review": {
            "type": "boolean",
            "description": "Review. Comparison: setting.",
            "nullable": true
          },
          "subrogation_waiver": {
            "type": "boolean",
            "description": "Subrogation Waiver. Comparison: required.",
            "nullable": true
          }
        }
      },
      "CatalogCoverageRequirement": {
        "type": "object",
        "description": "The requirement fields of a coverage type from GET /coverage_types that has no schema here: its field keys and values. Numeric values are whole numbers (dollars), like the built-in limit fields.",
        "properties": {},
        "additionalProperties": {
          "oneOf": [
            {
              "type": "integer",
              "nullable": true
            },
            {
              "type": "boolean"
            },
            {
              "type": "string"
            }
          ]
        }
      },
      "RequirementCoverages": {
        "type": "object",
        "description": "The requirement's coverages, one entry per coverage type keyed by prefix. On a write each entry sets only the keys it carries; an unknown prefix or field is 422 validation_failed naming it. The set of coverage types can grow: discover it with GET /coverage_types.",
        "properties": {
          "gl": {
            "$ref": "#/components/schemas/CoverageRequirementGl"
          },
          "auto": {
            "$ref": "#/components/schemas/CoverageRequirementAuto"
          },
          "wc": {
            "$ref": "#/components/schemas/CoverageRequirementWc"
          },
          "umb": {
            "$ref": "#/components/schemas/CoverageRequirementUmb"
          },
          "pl": {
            "$ref": "#/components/schemas/CoverageRequirementPl"
          },
          "im": {
            "$ref": "#/components/schemas/CoverageRequirementIm"
          },
          "gk": {
            "$ref": "#/components/schemas/CoverageRequirementGk"
          },
          "cg": {
            "$ref": "#/components/schemas/CoverageRequirementCg"
          },
          "oh": {
            "$ref": "#/components/schemas/CoverageRequirementOh"
          },
          "pollution": {
            "$ref": "#/components/schemas/CoverageRequirementPollution"
          },
          "re": {
            "$ref": "#/components/schemas/CoverageRequirementRe"
          },
          "ava": {
            "$ref": "#/components/schemas/CoverageRequirementAva"
          },
          "db": {
            "$ref": "#/components/schemas/CoverageRequirementDb"
          },
          "pa": {
            "$ref": "#/components/schemas/CoverageRequirementPa"
          },
          "br": {
            "$ref": "#/components/schemas/CoverageRequirementBr"
          },
          "ti": {
            "$ref": "#/components/schemas/CoverageRequirementTi"
          },
          "cl": {
            "$ref": "#/components/schemas/CoverageRequirementCl"
          },
          "am": {
            "$ref": "#/components/schemas/CoverageRequirementAm"
          },
          "ab": {
            "$ref": "#/components/schemas/CoverageRequirementAb"
          }
        },
        "additionalProperties": {
          "description": "A coverage type from GET /coverage_types.",
          "allOf": [
            {
              "$ref": "#/components/schemas/CatalogCoverageRequirement"
            }
          ]
        }
      },
      "CoverageTypeField": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The key of the field in a requirement's coverages.<prefix>."
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "The type of the value written to the requirement.",
            "enum": [
              "boolean",
              "numeric",
              "text"
            ]
          },
          "comparison": {
            "type": "string",
            "description": "How the certificate value is checked: present (the coverage is on the certificate and in force), greater (at least), lesser (at most), required (shown), matches (equal), forbidden (not shown), custom (a combined rule of the compliance engine), setting (not compared; changes how the coverage is checked or routed), none (recorded on the requirement; the compliance engine does not check it).",
            "enum": [
              "present",
              "greater",
              "lesser",
              "required",
              "matches",
              "forbidden",
              "custom",
              "setting",
              "none"
            ]
          },
          "requirement_suffix": {
            "type": "string",
            "nullable": true,
            "description": "The dashboard's wording for the comparison (At Least, At Most, Required, Matches, ...); null for a setting."
          },
          "certificate_key": {
            "type": "string",
            "nullable": true,
            "description": "The certificate value the field is checked against, as the stored field name with <prefix>_ removed; null when the field is not compared with a certificate value. `certificate_key` names where the compared certificate value lives in `coverages.<prefix>`: `present`, `additional_insured` and `subrogation_waiver` at the entry's top level; the limit amounts in `limits` (every column whose name contains `limit`, except the General Liability `general_aggregate_limit_applies_*` boxes); everything else in `fields` (the type's other certificate fields, the GL aggregate-applies boxes and `ab_included` among them). A limit's key in `limits` follows the limits key rule (limits_each_occurance is limits.each_occurance)."
          }
        }
      },
      "CoverageType": {
        "type": "object",
        "description": "A coverage type: a key of coverages on requirements and certificates. The built-in types come from the requirement columns, the others from HoundDog's coverage catalog; the list can grow.",
        "properties": {
          "prefix": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "active": {
            "type": "boolean",
            "description": "False for a type no longer offered for new requirements (still read on existing ones)."
          },
          "individual_eligible": {
            "type": "boolean"
          },
          "fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CoverageTypeField"
            }
          }
        }
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement this project confers, the primary first."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "note_to_party": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "start_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "end_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "completed": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id: the account's active fields available on projects that hold a value (a field with no value is absent; {} when the account does not use custom fields). Served on the list and the detail, in the parties' shape.",
            "properties": {},
            "additionalProperties": {
              "$ref": "#/components/schemas/PartyCustomFieldValue"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ProjectCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "On an account that requires unique project names, a name another project of the account already has (compared ignoring case and surrounding spaces, completed and archived projects included) is 422 validation_failed naming name."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement this project confers, as the project serves them; a present key replaces the set and the first id becomes insurance_requirement_id. Needs enable_multiple_insurance_requirements; 403 feature_disabled otherwise, except that the value already served sent back is accepted and changes nothing. Cannot be sent with insurance_requirement_id."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "note_to_party": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "start_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date",
                "nullable": true
              },
              {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            ],
            "description": "A date (2027-03-10) or a timestamp in any offset, stored as the start of its US Central day. On an update, the date served sent back (or a timestamp of the stored instant) is not written. A timestamp without an offset is read in US Central."
          },
          "end_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date",
                "nullable": true
              },
              {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            ],
            "description": "A date (2027-03-10) or a timestamp in any offset, stored as the start of its US Central day. On an update, the date served sent back (or a timestamp of the stored instant) is not written. A timestamp without an offset is read in US Central."
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id, written as a patch: a key sent is written, a key omitted is left as it is, and a key sent as null (or with a null or blank value or user_id) clears that field (clearing a field that has no value changes nothing). {} and null change nothing. Only active fields available on projects are accepted; any other key, an archived field's included, is 422 naming custom_fields. Without custom fields on the account, the value a GET serves sent back changes nothing and anything else is 403 feature_disabled.",
            "properties": {},
            "additionalProperties": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/CustomFieldWrite"
                }
              ],
              "nullable": true
            },
            "nullable": true
          }
        }
      },
      "ProjectUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "On an account that requires unique project names, a name another project of the account already has (compared ignoring case and surrounding spaces, completed and archived projects included) is 422 validation_failed naming name."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Every insurance requirement this project confers, as the project serves them; a present key replaces the set and the first id becomes insurance_requirement_id. Needs enable_multiple_insurance_requirements; 403 feature_disabled otherwise, except that the value already served sent back is accepted and changes nothing. Cannot be sent with insurance_requirement_id."
          },
          "compliance_profile_id": {
            "type": "integer",
            "nullable": true
          },
          "note_to_party": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder": {
            "type": "string",
            "nullable": true
          },
          "start_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date",
                "nullable": true
              },
              {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            ],
            "description": "A date (2027-03-10) or a timestamp in any offset, stored as the start of its US Central day. On an update, the date served sent back (or a timestamp of the stored instant) is not written. A timestamp without an offset is read in US Central."
          },
          "end_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date",
                "nullable": true
              },
              {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            ],
            "description": "A date (2027-03-10) or a timestamp in any offset, stored as the start of its US Central day. On an update, the date served sent back (or a timestamp of the stored instant) is not written. A timestamp without an offset is read in US Central."
          },
          "custom_fields": {
            "type": "object",
            "description": "Keyed by custom field id, written as a patch: a key sent is written, a key omitted is left as it is, and a key sent as null (or with a null or blank value or user_id) clears that field (clearing a field that has no value changes nothing). {} and null change nothing. Only active fields available on projects are accepted; any other key, an archived field's included, is 422 naming custom_fields. Without custom fields on the account, the value a GET serves sent back changes nothing and anything else is 403 feature_disabled.",
            "properties": {},
            "additionalProperties": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/CustomFieldWrite"
                }
              ],
              "nullable": true
            },
            "nullable": true
          }
        }
      },
      "ProjectPartyAttach": {
        "type": "object",
        "required": [
          "party_id"
        ],
        "properties": {
          "party_id": {
            "type": "integer"
          },
          "insurance_requirement_id": {
            "type": "integer"
          },
          "compliance_profile_id": {
            "type": "integer"
          }
        }
      },
      "ProjectReopen": {
        "type": "object",
        "description": "end_date must be in the future; or clear_end_date.",
        "properties": {
          "end_date": {
            "oneOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "string",
                "format": "date-time"
              }
            ],
            "description": "A date (2027-03-10) or a timestamp, stored as the start of its US Central day; a timestamp without an offset is read in US Central."
          },
          "clear_end_date": {
            "type": "boolean"
          }
        }
      },
      "W9RequirementSpec": {
        "type": "object",
        "properties": {
          "required": {
            "type": "boolean"
          },
          "frequency": {
            "type": "string",
            "enum": [
              "once",
              "annually",
              "custom"
            ]
          },
          "renewal_months": {
            "type": "integer",
            "nullable": true
          },
          "annual_anchor_month": {
            "type": "integer",
            "nullable": true
          },
          "annual_anchor_day": {
            "type": "integer",
            "nullable": true
          },
          "annual_grace_period_days": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "SigningRequirementSpec": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "signing_template_id": {
            "type": "integer"
          },
          "signing_template_name": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          },
          "version_policy": {
            "type": "string",
            "enum": [
              "any",
              "latest"
            ]
          },
          "frequency": {
            "type": "string",
            "enum": [
              "once",
              "annually",
              "per_project",
              "custom"
            ]
          },
          "renewal_months": {
            "type": "integer",
            "nullable": true
          },
          "annual_anchor_month": {
            "type": "integer",
            "nullable": true
          },
          "annual_anchor_day": {
            "type": "integer",
            "nullable": true
          },
          "annual_grace_period_days": {
            "type": "integer",
            "nullable": true
          },
          "auto_send_on_new_version": {
            "type": "boolean"
          }
        }
      },
      "SigningRequirementWrite": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "signing_template_id": {
            "type": "integer"
          },
          "required": {
            "type": "boolean"
          },
          "frequency": {
            "type": "string",
            "enum": [
              "once",
              "annually",
              "per_project",
              "custom"
            ]
          },
          "version_policy": {
            "type": "string",
            "enum": [
              "any",
              "latest"
            ]
          },
          "renewal_months": {
            "type": "integer"
          },
          "position": {
            "type": "integer"
          },
          "_destroy": {
            "type": "boolean"
          }
        }
      },
      "ComplianceProfile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "is_default": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "w9_requirement": {
            "allOf": [
              {
                "$ref": "#/components/schemas/W9RequirementSpec"
              }
            ],
            "nullable": true
          },
          "signing_requirements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningRequirementSpec"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ComplianceProfileCreate": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "is_default": {
            "type": "boolean"
          },
          "insurance_requirement_id": {
            "type": "integer"
          },
          "w9_requirement": {
            "$ref": "#/components/schemas/W9RequirementSpec"
          },
          "signing_requirements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningRequirementWrite"
            }
          }
        }
      },
      "ComplianceProfileUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "is_default": {
            "type": "boolean"
          },
          "insurance_requirement_id": {
            "type": "integer"
          },
          "w9_requirement": {
            "$ref": "#/components/schemas/W9RequirementSpec"
          },
          "signing_requirements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningRequirementWrite"
            }
          }
        }
      },
      "Document": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "file_url": {
            "type": "string",
            "description": "A short-lived link to the stored file (two days), never null. Fetch it when you need the bytes; do not store it."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DocumentCreate": {
        "type": "object",
        "required": [
          "file",
          "name",
          "party_id"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          },
          "name": {
            "type": "string"
          },
          "party_id": {
            "type": "integer"
          }
        }
      },
      "Event": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "event_type": {
            "type": "string"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "details": {
            "type": "string",
            "nullable": true
          },
          "party_id": {
            "type": "integer",
            "nullable": true
          },
          "certificate_id": {
            "type": "integer",
            "nullable": true
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "compliance_request_id": {
            "type": "integer",
            "nullable": true
          },
          "w9_id": {
            "type": "integer",
            "description": "The W-9 a W-9 event is about, when the event carries one; null otherwise.",
            "nullable": true
          },
          "signing_request_id": {
            "type": "integer",
            "description": "The signing request a signing event is about; null for other events.",
            "nullable": true
          },
          "signing_template_id": {
            "type": "integer",
            "description": "The signing template of a signing event; null for other events.",
            "nullable": true
          },
          "parent_event_id": {
            "type": "integer",
            "nullable": true
          },
          "user_id": {
            "type": "integer",
            "nullable": true
          },
          "api_key_id": {
            "type": "integer",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "links": {
            "type": "object",
            "description": "Related API paths.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "WebhookSubscription": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "event_type": {
            "type": "string"
          },
          "endpoint": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "disabled": {
            "type": "boolean"
          },
          "payload_version": {
            "type": "integer",
            "enum": [
              1,
              2
            ]
          },
          "consecutive_failures": {
            "type": "integer"
          },
          "failing_since": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_error": {
            "type": "string",
            "nullable": true
          },
          "last_response_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookSubscriptionWithSecret": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookSubscription"
          },
          {
            "type": "object",
            "description": "The signing secret, returned once.",
            "required": [
              "secret"
            ],
            "properties": {
              "secret": {
                "type": "string"
              }
            }
          }
        ]
      },
      "WebhookSubscriptionCreate": {
        "type": "object",
        "required": [
          "event_type",
          "endpoint"
        ],
        "properties": {
          "event_type": {
            "type": "string"
          },
          "endpoint": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "disabled": {
            "type": "boolean"
          }
        }
      },
      "WebhookSubscriptionUpdate": {
        "type": "object",
        "properties": {
          "event_type": {
            "type": "string"
          },
          "endpoint": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "disabled": {
            "type": "boolean"
          }
        }
      },
      "WebhookDelivery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "event_id": {
            "type": "integer"
          },
          "attempt": {
            "type": "integer"
          },
          "response_code": {
            "type": "integer",
            "nullable": true
          },
          "duration_ms": {
            "type": "integer",
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookEventType": {
        "type": "object",
        "properties": {
          "event_type": {
            "type": "string"
          },
          "group": {
            "type": "string"
          }
        }
      },
      "Account": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_name": {
            "type": "string"
          },
          "party_name_singular": {
            "type": "string"
          },
          "project_name": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "project_name_override": {
            "type": "string",
            "nullable": true
          },
          "party_name_override": {
            "type": "string",
            "nullable": true
          },
          "tag_name_override": {
            "type": "string",
            "nullable": true
          },
          "triage_queue_name_override": {
            "type": "string",
            "nullable": true
          },
          "triage_entry_gate_mode": {
            "type": "string",
            "nullable": true
          },
          "triage_readd_on_resubmission": {
            "type": "boolean",
            "nullable": true
          },
          "certificate_holder_name": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_address1": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_address2": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_city": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_state": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_postal_code": {
            "type": "string",
            "nullable": true
          },
          "collect_w9": {
            "type": "boolean",
            "nullable": true
          },
          "note_to_party": {
            "type": "string",
            "nullable": true
          },
          "enable_party_notes": {
            "type": "boolean",
            "nullable": true
          },
          "cert_copy_address": {
            "type": "string",
            "nullable": true
          },
          "cert_copy_all_submissions": {
            "type": "boolean",
            "nullable": true
          },
          "cert_copy_show_external_id": {
            "type": "boolean",
            "nullable": true
          },
          "project_completion_retention_days": {
            "type": "integer",
            "nullable": true
          },
          "party_assignment_mode": {
            "type": "string",
            "nullable": true
          },
          "request_email_note": {
            "type": "string",
            "nullable": true
          },
          "apply_umb_to_gl_limits": {
            "type": "boolean",
            "nullable": true
          },
          "apply_umb_to_auto_limits": {
            "type": "boolean",
            "nullable": true
          },
          "contact_limit_override": {
            "type": "integer",
            "nullable": true
          },
          "contact_delay_override": {
            "type": "integer",
            "nullable": true
          },
          "validate_certificate_holder": {
            "type": "boolean",
            "nullable": true
          },
          "validate_certificate_holder_address": {
            "type": "boolean",
            "nullable": true
          },
          "require_mfa": {
            "type": "boolean",
            "nullable": true,
            "description": "Read-only through the API: change it on the dashboard's Settings page. Sending the value already served to PATCH /account is accepted and changes nothing; any other value is 422 naming the field."
          },
          "require_approval_override_date": {
            "type": "boolean",
            "nullable": true,
            "description": "Read-only through the API: change it on the dashboard's Settings page. Sending the value already served to PATCH /account is accepted and changes nothing; any other value is 422 naming the field."
          },
          "require_approval_override_notes": {
            "type": "boolean",
            "nullable": true,
            "description": "Read-only through the API: change it on the dashboard's Settings page. Sending the value already served to PATCH /account is accepted and changes nothing; any other value is 422 naming the field."
          },
          "workday_notifications_only": {
            "type": "boolean",
            "nullable": true
          },
          "individual_name_override": {
            "type": "string",
            "nullable": true
          },
          "show_vendor_contact_information": {
            "type": "boolean",
            "nullable": true
          },
          "enable_editing_of_vendor_addresses": {
            "type": "boolean",
            "nullable": true
          },
          "note_to_individuals": {
            "type": "string",
            "nullable": true
          },
          "individual_email_note": {
            "type": "string",
            "nullable": true
          },
          "enable_expiration_reminders": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "AccountUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "project_name_override": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Project",
              "Location",
              "Department",
              "Risk Level",
              "Division",
              "Trade",
              "Type",
              "Tag",
              "Group",
              "Vendor Type",
              "Owner",
              "Building",
              "Landlord",
              "Contract",
              "Purchase Order",
              null
            ],
            "description": "One of the dashboard's choices for this label. The value already stored is always accepted when sent back unchanged, including null and an older label no longer in this list; changing to any other value is 422 validation_failed naming the field."
          },
          "party_name_override": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Subcontractor",
              "Service Provider",
              "Vendor",
              "Contractor",
              "Company",
              "Supplier",
              "Carrier",
              "Owner-Operator",
              "Trade",
              "Tenant",
              "Customer",
              "Owner",
              "Tracked Party",
              null
            ],
            "description": "One of the dashboard's choices for this label. The value already stored is always accepted when sent back unchanged, including null and an older label no longer in this list; changing to any other value is 422 validation_failed naming the field."
          },
          "tag_name_override": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Tag",
              "Location",
              "Department",
              "Risk Level",
              "Division",
              "Trade",
              "Type",
              "Project",
              "Group",
              "Vendor Type",
              null
            ],
            "description": "One of the dashboard's choices for this label. The value already stored is always accepted when sent back unchanged, including null and an older label no longer in this list; changing to any other value is 422 validation_failed naming the field."
          },
          "triage_queue_name_override": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Triage Queue",
              "Exception Queue",
              "Follow-Up Queue",
              "Escalation Queue",
              "Action Queue",
              "Attention Queue",
              null
            ],
            "description": "One of the dashboard's choices for this label. The value already stored is always accepted when sent back unchanged, including null and an older label no longer in this list; changing to any other value is 422 validation_failed naming the field."
          },
          "triage_entry_gate_mode": {
            "type": "string",
            "nullable": true,
            "enum": [
              "any_submission",
              "current_policy",
              "has_current_coverage",
              "all_required_coverages_active",
              null
            ],
            "description": "One of the dashboard's choices, or null for none. The value already stored is always accepted when sent back unchanged; any other value is 422 validation_failed naming the field."
          },
          "triage_readd_on_resubmission": {
            "type": "boolean",
            "nullable": true
          },
          "certificate_holder_name": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_address1": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_address2": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_city": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_state": {
            "type": "string",
            "nullable": true
          },
          "certificate_holder_postal_code": {
            "type": "string",
            "nullable": true
          },
          "collect_w9": {
            "type": "boolean",
            "nullable": true
          },
          "note_to_party": {
            "type": "string",
            "nullable": true
          },
          "enable_party_notes": {
            "type": "boolean",
            "nullable": true
          },
          "cert_copy_address": {
            "type": "string",
            "nullable": true
          },
          "cert_copy_all_submissions": {
            "type": "boolean",
            "nullable": true
          },
          "cert_copy_show_external_id": {
            "type": "boolean",
            "nullable": true
          },
          "project_completion_retention_days": {
            "type": "integer",
            "nullable": true,
            "enum": [
              7,
              28,
              183,
              366,
              731,
              1096,
              1461,
              1826,
              2191,
              2557,
              2922,
              3287,
              3652,
              null
            ],
            "description": "One of the dashboard's choices, or null for none. The value already stored is always accepted when sent back unchanged; any other value is 422 validation_failed naming the field."
          },
          "party_assignment_mode": {
            "type": "string",
            "nullable": true,
            "enum": [
              "direct",
              "both",
              null
            ],
            "description": "direct or both. The value already stored is always accepted when sent back unchanged."
          },
          "request_email_note": {
            "type": "string",
            "nullable": true
          },
          "apply_umb_to_gl_limits": {
            "type": "boolean",
            "nullable": true
          },
          "apply_umb_to_auto_limits": {
            "type": "boolean",
            "nullable": true
          },
          "contact_limit_override": {
            "type": "integer",
            "nullable": true
          },
          "contact_delay_override": {
            "type": "integer",
            "nullable": true
          },
          "validate_certificate_holder": {
            "type": "boolean",
            "nullable": true
          },
          "validate_certificate_holder_address": {
            "type": "boolean",
            "nullable": true
          },
          "workday_notifications_only": {
            "type": "boolean",
            "nullable": true
          },
          "individual_name_override": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Employee",
              "Individual",
              "Customer",
              "Person",
              "Member",
              null
            ],
            "description": "One of the dashboard's choices for this label. The value already stored is always accepted when sent back unchanged, including null and an older label no longer in this list; changing to any other value is 422 validation_failed naming the field."
          },
          "show_vendor_contact_information": {
            "type": "boolean",
            "nullable": true
          },
          "enable_editing_of_vendor_addresses": {
            "type": "boolean",
            "nullable": true
          },
          "note_to_individuals": {
            "type": "string",
            "nullable": true
          },
          "individual_email_note": {
            "type": "string",
            "nullable": true
          },
          "enable_expiration_reminders": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "email": {
            "type": "string"
          },
          "first_name": {
            "type": "string",
            "nullable": true
          },
          "last_name": {
            "type": "string",
            "nullable": true
          },
          "account_status": {
            "type": "string",
            "enum": [
              "Admin",
              "User",
              "Agent"
            ]
          },
          "invitation_pending": {
            "type": "boolean"
          }
        }
      },
      "UserInvite": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "A plain email address (local part of letters, digits and . ! # $ % & ' * + / = ? ^ _ ` { | } ~ -, then @ and a domain). Anything else, markup included, is 422 validation_failed naming email; so is an address already in use."
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "account_status": {
            "type": "string",
            "enum": [
              "Admin",
              "User",
              "Agent"
            ],
            "default": "User"
          }
        }
      },
      "UserUpdate": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "account_status": {
            "type": "string",
            "enum": [
              "Admin",
              "User",
              "Agent"
            ]
          }
        }
      },
      "W9RequestedBy": {
        "type": "object",
        "description": "One of user_id or api_key_id.",
        "properties": {
          "user_id": {
            "type": "integer"
          },
          "api_key_id": {
            "type": "integer"
          }
        }
      },
      "W9": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "signed_online",
              "uploaded",
              null
            ],
            "nullable": true
          },
          "signed_at": {
            "type": "string",
            "format": "date-time",
            "description": "When it was signed or uploaded; null for a W-9 converted from a certificate upload.",
            "nullable": true
          },
          "form_year": {
            "type": "integer",
            "enum": [
              2018,
              2024,
              null
            ],
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "business_name": {
            "type": "string",
            "nullable": true
          },
          "tax_classification": {
            "type": "string",
            "nullable": true
          },
          "tax_classification_llc": {
            "type": "string",
            "nullable": true
          },
          "tax_classification_other": {
            "type": "string",
            "nullable": true
          },
          "exempt_payee_code": {
            "type": "integer",
            "nullable": true
          },
          "exemption_fatca_code": {
            "type": "integer",
            "nullable": true
          },
          "foreign_partners": {
            "type": "boolean",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "address2": {
            "type": "string",
            "nullable": true
          },
          "certification_agreed": {
            "type": "boolean",
            "nullable": true
          },
          "tin_type": {
            "type": "string",
            "enum": [
              "ssn",
              "ein",
              null
            ],
            "nullable": true
          },
          "tin_last4": {
            "type": "string",
            "nullable": true
          },
          "tin": {
            "type": "string",
            "pattern": "^[0-9]{9}$",
            "description": "Present only when the account allows tax IDs through the API AND the key has the w9 grant, and a TIN is on file. Zero-padded to nine digits. null when the stored value has more than nine digits (not a valid TIN); tin_last4 then shows its last four digits.",
            "nullable": true
          },
          "email_request_count": {
            "type": "integer",
            "nullable": true
          },
          "email_last_sent": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "requested_by": {
            "description": "null when the app created the W-9 (collect-on-create, the multi-factor bootstrap, a JobTread sync) and when the W-9 was created by an upload (by your staff or an API key). A W-9 converted from a certificate upload names the certificate's uploader.",
            "allOf": [
              {
                "$ref": "#/components/schemas/W9RequestedBy"
              }
            ],
            "nullable": true
          },
          "form_url": {
            "type": "string",
            "description": "The W-9 request page the party is emailed, where it signs the form online or uploads a file while the W-9 is pending. A bearer link: anyone holding it can act as the party on that page. Treat it like a password and never log it."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "links": {
            "type": "object",
            "description": "Related API paths.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "W9Create": {
        "type": "object",
        "required": [
          "party_id"
        ],
        "properties": {
          "party_id": {
            "type": "integer"
          },
          "replace": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "W9Upload": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          }
        }
      },
      "SigningTemplateRecipient": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "role_name": {
            "type": "string",
            "nullable": true
          },
          "signer": {
            "type": "string",
            "enum": [
              "party",
              "fixed"
            ]
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "email_address": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SigningTemplatePrefilledField": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "field_type": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "party",
              "date",
              "value"
            ]
          },
          "required": {
            "type": "boolean"
          }
        }
      },
      "SigningOverrideTerm": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "forever",
              "days",
              "years",
              "prefilled_field",
              "field"
            ]
          },
          "amount": {
            "type": "integer",
            "nullable": true
          },
          "prefilled_field_id": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "SigningTemplate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "document_name": {
            "type": "string",
            "nullable": true
          },
          "active": {
            "type": "boolean"
          },
          "repeatable": {
            "type": "boolean"
          },
          "send_automatically": {
            "type": "boolean"
          },
          "sending_trigger": {
            "type": "string",
            "nullable": true
          },
          "trigger_coverage_prefix": {
            "type": "string",
            "nullable": true
          },
          "state_restriction": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "only_selected",
                  "exclude_selected",
                  null
                ],
                "nullable": true
              },
              "states": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "adds_approval_override": {
            "type": "boolean"
          },
          "approval_override_coverage_prefix": {
            "type": "string",
            "nullable": true
          },
          "approval_override_term": {
            "description": "null when the template adds no override.",
            "allOf": [
              {
                "$ref": "#/components/schemas/SigningOverrideTerm"
              }
            ],
            "nullable": true
          },
          "succeeds_template_id": {
            "type": "integer",
            "nullable": true
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningTemplateRecipient"
            }
          },
          "prefilled_fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningTemplatePrefilledField"
            }
          }
        }
      },
      "SigningRequestRecipient": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "email_address": {
            "type": "string",
            "nullable": true
          },
          "role_name": {
            "type": "string",
            "nullable": true
          },
          "signer": {
            "type": "string",
            "enum": [
              "party",
              "fixed"
            ]
          },
          "signed": {
            "type": "boolean"
          },
          "signed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "contact_count": {
            "type": "integer",
            "nullable": true
          },
          "last_contacted": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "SigningRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer",
            "nullable": true
          },
          "project_id": {
            "type": "integer",
            "nullable": true
          },
          "signing_template_id": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "completed",
              "no_longer_needed"
            ]
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "signing_order": {
            "type": "string",
            "description": "Served lowercase (stored uppercase); null for an external upload.",
            "enum": [
              "sequential",
              "parallel",
              null
            ],
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "invalidated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "invalidated_reason": {
            "type": "string",
            "nullable": true
          },
          "uploaded_externally": {
            "type": "boolean"
          },
          "concurrent": {
            "type": "boolean"
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningRequestRecipient"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "links": {
            "type": "object",
            "description": "Related API paths.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "SigningRequestCreate": {
        "type": "object",
        "required": [
          "signing_template_id",
          "party_id"
        ],
        "properties": {
          "signing_template_id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "project_id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "prefilled_values": {
            "type": "object",
            "description": "Keyed by prefilled field id.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          },
          "supersede": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "SigningRequestInvalidate": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string"
          }
        }
      },
      "SigningRequestUploadExternal": {
        "type": "object",
        "required": [
          "file",
          "signing_template_id",
          "party_id"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          },
          "signing_template_id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "project_id": {
            "type": "integer"
          },
          "supersede": {
            "type": "boolean",
            "default": false
          },
          "prefilled_values": {
            "type": "string",
            "description": "In this multipart request prefilled_values is a JSON-encoded string, for example prefilled_values={\"40\":\"2027-03-01\"}, holding only the override-term field."
          }
        }
      },
      "RequirementStatusFailure": {
        "type": "object",
        "properties": {
          "certificate_field": {
            "type": "string",
            "nullable": true,
            "description": "null (with requirement_field) for a message-only failure."
          },
          "requirement_field": {
            "type": "string",
            "nullable": true
          },
          "required": {},
          "carried": {},
          "message": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "RequirementStatus": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "scope": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "party",
                  "project"
                ]
              },
              "id": {
                "type": "integer"
              }
            }
          },
          "factor": {
            "type": "string",
            "enum": [
              "insurance",
              "w9",
              "document_signing"
            ]
          },
          "requirement_key": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "satisfied",
              "waived",
              "missing",
              "lapsed",
              "deficient"
            ]
          },
          "waiver_source": {
            "type": "string",
            "nullable": true
          },
          "evidence_status": {
            "type": "string",
            "nullable": true
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "failures": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RequirementStatusFailure"
            }
          },
          "insurance_requirement_ids": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "governing_insurance_requirement_id": {
            "type": "integer",
            "nullable": true
          },
          "certificate_id": {
            "type": "integer",
            "nullable": true
          },
          "approval_override_id": {
            "type": "integer",
            "nullable": true
          },
          "expires_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "lapsed_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "status_since": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "recheck_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "changed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "links": {
            "type": "object",
            "description": "Related API paths.",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "PartyList": {
        "type": "object",
        "description": "Collection envelope of Party.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Party"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "PartyDetailList": {
        "type": "object",
        "description": "Collection envelope of PartyDetail.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PartyDetail"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "PartyContactList": {
        "type": "object",
        "description": "Collection envelope of PartyContact.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PartyContact"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "CertificateList": {
        "type": "object",
        "description": "Collection envelope of Certificate.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Certificate"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "ApprovalOverrideList": {
        "type": "object",
        "description": "Collection envelope of ApprovalOverride.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApprovalOverride"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "ComplianceRequestList": {
        "type": "object",
        "description": "Collection envelope of ComplianceRequest.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ComplianceRequest"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "InsuranceRequirementList": {
        "type": "object",
        "description": "Collection envelope of InsuranceRequirement.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InsuranceRequirement"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "CoverageTypeList": {
        "type": "object",
        "description": "Collection envelope of CoverageType.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CoverageType"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "ProjectList": {
        "type": "object",
        "description": "Collection envelope of Project.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Project"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "ComplianceProfileList": {
        "type": "object",
        "description": "Collection envelope of ComplianceProfile.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ComplianceProfile"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "DocumentList": {
        "type": "object",
        "description": "Collection envelope of Document.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "EventList": {
        "type": "object",
        "description": "Collection envelope of Event.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "WebhookSubscriptionList": {
        "type": "object",
        "description": "Collection envelope of WebhookSubscription.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookSubscription"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "WebhookDeliveryList": {
        "type": "object",
        "description": "Collection envelope of WebhookDelivery.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookDelivery"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "WebhookEventTypeList": {
        "type": "object",
        "description": "Collection envelope of WebhookEventType.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookEventType"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "UserList": {
        "type": "object",
        "description": "Collection envelope of User.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/User"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "W9List": {
        "type": "object",
        "description": "Collection envelope of W9.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/W9"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "SigningTemplateList": {
        "type": "object",
        "description": "Collection envelope of SigningTemplate.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningTemplate"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "SigningRequestList": {
        "type": "object",
        "description": "Collection envelope of SigningRequest.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SigningRequest"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "RequirementStatusList": {
        "type": "object",
        "description": "Collection envelope of RequirementStatus.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RequirementStatus"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "InsuranceDocument": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "party_id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "document_type": {
            "type": "string",
            "nullable": true,
            "description": "The type chosen on the dashboard: Additional Insured Endorsement, Subrogation Waiver, Loss Payable Endorsement, Primary & Noncontributory Endorsement, Endorsement or Other. Treat it as text: a document moved from the certificate review may carry another value, or none."
          },
          "policy_number": {
            "type": "string",
            "nullable": true
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "file_url": {
            "type": "string",
            "description": "A short-lived link to the stored file (two days), never null. Fetch it when you need the bytes; do not store it."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "InsuranceDocumentList": {
        "type": "object",
        "description": "Collection envelope of InsuranceDocument.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InsuranceDocument"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "CustomField": {
        "type": "object",
        "description": "A custom field definition. Fields are created and edited in the dashboard. Type-specific definition attributes, when a type has them, are added as new members.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "field_type": {
            "type": "string",
            "enum": [
              "string",
              "integer",
              "user"
            ],
            "description": "The field's type (see Custom field types on the parties page): what a record's entry for this field serves and accepts."
          },
          "applies_to": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "parties",
                "projects"
              ]
            },
            "description": "The record types the field appears on, parties before projects."
          },
          "show_on_triage_queue": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean",
            "description": "An archived field is not served on records and takes no writes; its values are kept."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CustomFieldList": {
        "type": "object",
        "description": "Collection envelope of CustomField.",
        "required": [
          "data",
          "total",
          "has_more",
          "next_page"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomField"
            }
          },
          "total": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "CustomFieldCreate": {
        "type": "object",
        "required": [
          "name",
          "field_type"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Unique among the account's active fields, ignoring case and surrounding spaces (422 naming name otherwise). Spaces around it are removed."
          },
          "field_type": {
            "type": "string",
            "enum": [
              "string",
              "integer",
              "user"
            ],
            "description": "The type's API name."
          },
          "applies_to": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "parties",
                "projects"
              ]
            },
            "description": "Where the field appears: parties, projects (needs projects on the account: adding it otherwise is 403 feature_disabled naming applies_to), both, or neither. [\"parties\"] when omitted."
          },
          "show_on_triage_queue": {
            "type": "boolean",
            "description": "false when omitted. Turning it on without the triage queue is 403 feature_disabled naming show_on_triage_queue."
          }
        }
      },
      "CustomFieldUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Unique among the account's active fields, ignoring case and surrounding spaces (422 naming name otherwise)."
          },
          "field_type": {
            "type": "string",
            "enum": [
              "string",
              "integer",
              "user"
            ],
            "description": "Changes only while the field has no value on any record; otherwise 409 conflict. The type the field already has is not a change."
          },
          "applies_to": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "parties",
                "projects"
              ]
            },
            "description": "Where the field appears: parties, projects (needs projects on the account: adding it otherwise is 403 feature_disabled naming applies_to), both, or neither."
          },
          "show_on_triage_queue": {
            "type": "boolean",
            "description": "Turning it on without the triage queue is 403 feature_disabled naming show_on_triage_queue."
          },
          "archived": {
            "type": "boolean",
            "description": "Accepted only as served; any other value is 422 naming archived (use the archive and unarchive routes)."
          }
        }
      }
    }
  }
}