diff --git a/ER-22752.json b/ER-22752.json
new file mode 100644
index 0000000000000000000000000000000000000000..01abb4e402a17c65168547ca09daef71d95aa2c5
--- /dev/null
+++ b/ER-22752.json
@@ -0,0 +1,3604 @@
+{
+  "openapi": "3.0.2",
+  "info": {
+    "title": "Person API",
+    "version": "1.0.0",
+    "contact": {
+      "name": "DoIT Enterprise Integration API Team",
+      "email": "api@doit.wisc.edu",
+      "url": "https://go.wisc.edu/k701y6"
+    },
+    "description": "An API for interacting with person data at UW-Madison. Refer to the [Person API Documentation](/person-api) for more information about this API."
+  },
+  "externalDocs": {
+    "description": "Read more about JSON:API here",
+    "url": "https://jsonapi.org/"
+  },
+  "servers": [
+    {
+      "url": "https://doit.dev.api.wisc.edu"
+    }
+  ],
+  "security": [
+    {
+      "OAuth2ClientCredentials": []
+    }
+  ],
+  "paths": {
+    "/people": {
+      "get": {
+        "description": "Get a collection of people.",
+        "summary": "Get people.",
+        "operationId": "get_people",
+        "tags": [
+          "people"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/filter"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          },
+          {
+            "$ref": "#/components/parameters/page"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/people"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}": {
+      "get": {
+        "description": "Get a person. It is not recommended to manually build this URL or other URLs that contain path parameters, for example, by using concatenation. Instead, use the fully-qualified links returned in other resources to use this resource and other \"Get By ID\" resources.",
+        "summary": "Get a person.",
+        "operationId": "get_person",
+        "tags": [
+          "people"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/people-id"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/identifiers": {
+      "get": {
+        "description": "Get identifiers for a person. This endpoint returns all current and past identifiers for the person..",
+        "summary": "Get identifiers.",
+        "operationId": "get_person_identifiers",
+        "tags": [
+          "identifiers"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/filter"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/identifiers"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/jobs": {
+      "get": {
+        "description": "Get jobs for a person.",
+        "summary": "Get jobs.",
+        "operationId": "get_person_jobs",
+        "tags": [
+          "jobs"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/filter"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/jobs"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/wiscard": {
+      "get": {
+        "description": "Details and metadata about a person's Wiscard.",
+        "summary": "Get Wiscard.",
+        "operationId": "get_person_wiscard",
+        "tags": [
+          "wiscard"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/wiscard"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/names": {
+      "get": {
+        "description": "Get a person's names, split into separate resource objects depending on the type of name.",
+        "summary": "Get names.",
+        "operationId": "get_person_names",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/names"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Create a name for a person. Only names with `nameType` of `nameInUse` can be created. Client-generated IDs are not supported.",
+        "summary": "Create a name.",
+        "operationId": "create_person_name",
+        "tags": [
+          "names"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newName"
+        },
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "202": {
+            "description": "Name created, but additional processing is needed for it to show in the API."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/names/{nameId}": {
+      "get": {
+        "description": "Get a name by ID.",
+        "summary": "Get a name.",
+        "operationId": "get_person_name",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Update a name for a person. Only names with `nameType` of `nameInUse` can be updated. Updating the ID is not allowed.",
+        "summary": "Update a name.",
+        "operationId": "update_person_name",
+        "tags": [
+          "names"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updatedName"
+        },
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "202": {
+            "description": "Name updated, but additional processing is needed for the updates to show in the API."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Delete a name for a person. Only names with `nameType` of `nameInUse` can be deleted.",
+        "summary": "Delete a name.",
+        "operationId": "delete_person_name",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Name deleted, but additional processing is needed before the name won't appear in the API."
+          },
+          "204": {
+            "description": "Name deleted. Empty response."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks": {
+      "get": {
+        "description": "Get a collection of webhooks. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get webhooks.",
+        "operationId": "get_webhooks",
+        "tags": [
+          "webhooks"
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhooks"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a webhook. A maximum of 1 webhook per Developer Portal application is allowed. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a webhook.",
+        "operationId": "create_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhook"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/createdWebhook"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}": {
+      "get": {
+        "description": "Get a single webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a webhook.",
+        "operationId": "get_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhook"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a webhook.",
+        "operationId": "update_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updatedWebhook"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhook"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a webhook.",
+        "operationId": "delete_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Webhook deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/replay": {
+      "post": {
+        "description": "Replay events for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Replay events.",
+        "operationId": "replay_events_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/replayWebhook"
+        },
+        "responses": {
+          "202": {
+            "description": "Webhook replayed. Empty response."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/filters": {
+      "get": {
+        "description": "Get all filters for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get all filters for a webhook.",
+        "operationId": "get_all_filters_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhookFilters"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a filter for a webhook.",
+        "operationId": "create_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhookFilter"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/filters/{filterId}": {
+      "get": {
+        "description": "Get a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a filter for a webhook.",
+        "operationId": "get_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a filter for a webhook.",
+        "operationId": "update_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updateWebhookFilter"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a filter for a webhook.",
+        "operationId": "delete_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Name deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/relationshipFilters": {
+      "get": {
+        "description": "Get all relationship filters for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get all relationship filters for a webhook.",
+        "operationId": "get_all_relationship_filters_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhookRelationshipFilters"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a relationship filter for a webhook.",
+        "operationId": "create_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhookRelationshipFilter"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/relationshipFilters/{relationshipFilterId}": {
+      "get": {
+        "description": "Get a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a relationship filter for a webhook.",
+        "operationId": "get_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a relationship filter for a webhook.",
+        "operationId": "update_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updateWebhookRelationshipFilter"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a relationship filter for a webhook.",
+        "operationId": "delete_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Webhook relationship filter deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "securitySchemes": {
+      "OAuth2ClientCredentials": {
+        "type": "oauth2",
+        "flows": {
+          "clientCredentials": {
+            "tokenUrl": "https://doit.dev.api.wisc.edu/oauth/token",
+            "scopes": {}
+          }
+        }
+      }
+    },
+    "schemas": {
+      "people": {
+        "description": "A person",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships",
+          "links",
+          "meta"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "people"
+          },
+          "id": {
+            "$ref": "#/components/schemas/personId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "firstName",
+              "lastName",
+              "emailAddress",
+              "officeAddress",
+              "officePhoneNumber"
+            ],
+            "properties": {
+              "firstName": {
+                "type": "string",
+                "example": "John",
+                "description": "First name, derived from the person's current UW affiliations."
+              },
+              "lastName": {
+                "type": "string",
+                "example": "Smith",
+                "description": "Last name, derived from the person's current UW affiliations."
+              },
+              "emailAddress": {
+                "type": "string",
+                "example": "john.smith@wisc.edu",
+                "description": "The email address this person has designated as their primary, if set.  Otherwise, their Campus Business Email, or other email derived from their current UW affiliations."
+              },
+              "officeAddress": {
+                "type": "string",
+                "description": "Primary work-related address derived from the person's current UW affiliations.  May or may not be a fully-formed street address.",
+                "example": "1210 W. Dayton Street Madison, WI 53706-1613"
+              },
+              "officePhoneNumber": {
+                "type": "string",
+                "example": "608-262-1204",
+                "description": "Primary work-related phone number derived from the person's current UW affiliations.  May or may not be associated with the officeAddress."
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "identifiers",
+              "jobs",
+              "names",
+              "wiscard"
+            ],
+            "properties": {
+              "identifiers": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "jobs": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "names": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "wiscard": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "meta": {
+            "type": "object",
+            "properties": {
+              "ferpa": {
+                "type": "boolean",
+                "example": false,
+                "description": "Indicates whether or not a student has elected FERPA coverage on one or more of their attributes. Please see https://registrar.wisc.edu/ferpa/ for more details about how to handle FERPA data."
+              },
+              "ferpaAttributes": {
+                "type": "array",
+                "items": {
+                  "type": "string"
+                },
+                "description": "Not currently used."
+              },
+              "privateAttributes": {
+                "type": "array",
+                "items": {
+                  "type": "string"
+                },
+                "description": "Not currently used."
+              }
+            }
+          }
+        }
+      },
+      "identifierAttributes": {
+        "type": "object",
+        "required": [
+          "name",
+          "source",
+          "value",
+          "current"
+        ],
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "pvi",
+            "description": "The name of this identifier. We currently support pvi, netId, emplId, and photoId."
+          },
+          "source": {
+            "type": "string",
+            "example": "IAM",
+            "description": "The source of this identifier. We have identifiers from IAM, HRS, SIS, and WISCARD."
+          },
+          "value": {
+            "type": "string",
+            "example": "UW123A456"
+          },
+          "current": {
+            "description": "Property that indicates if this identifier is currently used.",
+            "type": "boolean",
+            "example": true
+          }
+        }
+      },
+      "identifiers": {
+        "description": "An identifier",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "identifiers"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/identifierAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "jobs": {
+        "description": "A job",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "jobs"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "title",
+              "division",
+              "divisionCode",
+              "departmentUnit",
+              "beginDate",
+              "endDate",
+              "effectiveDate",
+              "fullTimeEquivalent",
+              "payBasis",
+              "employeeCategoryCode",
+              "employeeCategory",
+              "jobCode",
+              "businessTitle",
+              "position",
+              "current"
+            ],
+            "properties": {
+              "title": {
+                "type": "string",
+                "example": "Software Eng/Developer I",
+                "description": "Title of the person's position at this job."
+              },
+              "division": {
+                "type": "string",
+                "example": "INFORMATION TECHNOLOGY",
+                "description": "High level organizational unit where the job is located."
+              },
+              "divisionCode": {
+                "type": "string",
+                "example": "A067040",
+                "description": "Code for the location of the job."
+              },
+              "departmentUnit": {
+                "type": "string",
+                "example": "L&S/COMPUTER SCI/COMP SCI",
+                "description": "Organization path where the job is located."
+              },
+              "beginDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2018-01-01",
+                "description": "The date the job began."
+              },
+              "endDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2025-01-01",
+                "description": "The date the job ended."
+              },
+              "effectiveDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2018-01-01",
+                "description": "The date the newest action on this job is effective."
+              },
+              "fullTimeEquivalent": {
+                "type": "string",
+                "example": "0.5",
+                "description": "The full time equivalency of the job."
+              },
+              "payBasis": {
+                "type": "string",
+                "enum": [
+                  "Academic",
+                  "Annual",
+                  "Hourly",
+                  "Lump",
+                  "No Pay Basis",
+                  "Summer Service",
+                  "Summer Session",
+                  "Unknown"
+                ],
+                "example": "Annual",
+                "description": "The pay basis for this position."
+              },
+              "employeeCategoryCode": {
+                "type": "string",
+                "example": "AS",
+                "description": "Unique identifier for an employee category."
+              },
+              "employeeCategory": {
+                "type": "string",
+                "example": "Academic Staff",
+                "description": "See this document for information on this field: https://kb.wisc.edu/ohr/policies/page.php?id=53496"
+              },
+              "jobCode": {
+                "type": "string",
+                "example": "IT002",
+                "description": "Unique identifier for the job title."
+              },
+              "businessTitle": {
+                "type": "string",
+                "example": "Software Engineer/Developer",
+                "description": "Business title of the person's position at this job."
+              },
+              "position": {
+                "type": "string",
+                "example": "00123456-1",
+                "description": "An identifier to be used to uniquely identify a job for a person. This is a concatenation of the position and job record from Peoplesoft HRS, separated by a hyphen '-' (without quotes). It is not recommended to parse this value, but instead use it as an opaque identifier."
+              },
+              "current": {
+                "type": "boolean",
+                "example": true,
+                "description": "Property that indicates if this job is current."
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "person",
+              "supervisor"
+            ],
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              },
+              "supervisor": {
+                "description": "The supervisor for the job. If the job reports to a position that has 0 or greater than 2 people occupying it, this relationship is empty. If the job reports to a position occupied by 2 people, this relationship points to the person with the most recently entered job.",
+                "type": "object",
+                "properties": {
+                  "links": {
+                    "type": "object",
+                    "properties": {
+                      "related": {
+                        "type": "string",
+                        "example": "https://api.wisc.edu/people/123"
+                      }
+                    }
+                  },
+                  "data": {
+                    "type": "object",
+                    "properties": {
+                      "type": {
+                        "type": "string",
+                        "example": "people"
+                      },
+                      "id": {
+                        "type": "string",
+                        "example": "123"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "wiscard": {
+        "description": "Details and metadata from someone's Wiscard.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "wiscard"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "wiscardId",
+              "expirationDate",
+              "issueCode"
+            ],
+            "properties": {
+              "wiscardId": {
+                "description": "The ID number printed on this Wiscard.",
+                "type": "string",
+                "example": "123213213"
+              },
+              "expirationDate": {
+                "description": "The date this Wiscard will expire.",
+                "type": "string",
+                "format": "date",
+                "example": "2024-01-01"
+              },
+              "issueCode": {
+                "description": "The number of times a new Wiscard was issued for the holder of this Wiscard, starting with 0.",
+                "type": "string",
+                "example": "0"
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "names": {
+        "description": "Details about the names used to refer to a person.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "names"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/nameAttributes"
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "nameAttributes": {
+        "type": "object",
+        "required": [
+          "firstName",
+          "middleName",
+          "lastName",
+          "nameType",
+          "source"
+        ],
+        "properties": {
+          "firstName": {
+            "description": "A first name for this person. For the `nameType` of `nameInUse`, this name can only contain A-Z and a-z characters, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Amy"
+          },
+          "middleName": {
+            "description": "A middle name for this person. For the `nameType` of `nameInUse`, this name can only contain A-Z and a-z characters, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Marie"
+          },
+          "lastName": {
+            "description": "A last name for this person. For the `nameType` of `nameInUse`, this field can only be edited to change capitalization, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Smith"
+          },
+          "nameType": {
+            "description": "The type of name for the person.",
+            "type": "string",
+            "enum": [
+              "nameInUse",
+              "primary"
+            ],
+            "example": "nameInUse"
+          },
+          "source": {
+            "description": "The source of the name.",
+            "type": "string",
+            "enum": [
+              "profile",
+              "IAM"
+            ],
+            "example": "profile"
+          }
+        }
+      },
+      "errors": {
+        "description": "An error",
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "integer",
+            "example": 400
+          },
+          "title": {
+            "type": "string",
+            "example": "Error title"
+          },
+          "detail": {
+            "type": "string",
+            "example": "Additional details about the error"
+          },
+          "links": {
+            "type": "object"
+          },
+          "meta": {
+            "type": "object"
+          },
+          "source": {
+            "type": "object"
+          }
+        }
+      },
+      "selfLink": {
+        "description": "The link to access a resource itself",
+        "type": "object",
+        "properties": {
+          "self": {
+            "type": "string",
+            "example": "https://api.wisc.edu/link/to/self"
+          }
+        }
+      },
+      "pagination": {
+        "description": "The links associated with a paginated collection",
+        "type": "object",
+        "properties": {
+          "prev": {
+            "description": "The previous page of data",
+            "type": "string",
+            "format": "uri-reference",
+            "example": "https://api.wisc.edu/people?page[number]=4"
+          },
+          "next": {
+            "description": "The next page of data",
+            "type": "string",
+            "format": "uri-reference",
+            "example": "https://api.wisc.edu/people?page[number]=6"
+          }
+        }
+      },
+      "toManyRelationshipObject": {
+        "description": "A generic relationship object",
+        "type": "object",
+        "properties": {
+          "links": {
+            "type": "object",
+            "properties": {
+              "related": {
+                "type": "string",
+                "example": "https://api.wisc.edu/link/to/related/object"
+              }
+            }
+          },
+          "data": {
+            "type": "array",
+            "items": {
+              "type": "object",
+              "properties": {
+                "type": {
+                  "type": "string",
+                  "example": "sampleType"
+                },
+                "id": {
+                  "type": "string",
+                  "example": "sampleId"
+                }
+              }
+            }
+          }
+        }
+      },
+      "toOneRelationshipObject": {
+        "description": "A generic relationship object",
+        "type": "object",
+        "properties": {
+          "links": {
+            "type": "object",
+            "properties": {
+              "related": {
+                "type": "string",
+                "example": "https://api.wisc.edu/link/to/related/object"
+              }
+            }
+          },
+          "data": {
+            "type": "object",
+            "properties": {
+              "type": {
+                "type": "string",
+                "example": "sampleType"
+              },
+              "id": {
+                "type": "string",
+                "example": "sampleId"
+              }
+            }
+          }
+        }
+      },
+      "resourceObject": {
+        "description": "A generic resource object",
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "sampleType"
+          },
+          "id": {
+            "type": "string",
+            "example": "sampleId"
+          },
+          "attributes": {
+            "type": "object",
+            "properties": {
+              "attribute1": {
+                "type": "string",
+                "example": "sampleStringAttribute"
+              },
+              "attribute2": {
+                "type": "number",
+                "example": 123
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "relatedResource": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      },
+      "personId": {
+        "type": "string",
+        "description": "An ephemeral identifier used only in the Person API to adhere to the [JSON:API specification](https://jsonapi.org/format/#document-resource-object-identification). This ID may change if a person is split into two people or two people are merged into one person. This ID is used for paginating results or following other links returned in the API response. This ID should not be stored in a consuming system. Concatenating parts of the URL to form a link is discouraged. Instead, use the fully-formed links returned in an API response.",
+        "example": "12345"
+      },
+      "genericId": {
+        "type": "string",
+        "example": "12345",
+        "description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+      },
+      "webhookAttributes": {
+        "type": "object",
+        "required": [
+          "url",
+          "expired"
+        ],
+        "properties": {
+          "url": {
+            "type": "string",
+            "format": "url",
+            "example": "https://department.wisc.edu/person-api-webhook",
+            "description": "URL that accepts Person API webhook events. This URL must use HTTPS."
+          },
+          "token": {
+            "type": "string",
+            "readOnly": true,
+            "description": "A secret token sent with each webhook event. A server must verify this token when receiving a webhook from the Person API to ensure it is authenticate. This token is only returned when creating a webhook and cannot be set by the client. It cannot be retrieved again in future requests."
+          },
+          "expired": {
+            "type": "boolean",
+            "readOnly": false,
+            "description": "Indicates whether the webhook subscription has expired. This value can be set to false to un-expire a webhook but can not be set to true to expire it."
+          }
+        }
+      },
+      "webhookRequestAttributes": {
+        "type": "object",
+        "properties": {
+          "url": {
+            "type": "string",
+            "format": "url",
+            "example": "https://department.wisc.edu/person-api-webhook",
+            "description": "URL that accepts Person API webhook events. This URL must use HTTPS."
+          },
+          "expired": {
+            "type": "boolean",
+            "example": false,
+            "description": "Indicates whether the webhook subscription has expired. This value can be set to false to un-expire a webhook but can not be set to true to expire it."
+          }
+        }
+      },
+      "webhooks": {
+        "description": "A webhook represents the configuration for an application to subscribe to events for the Person API. A webhook is an HTTP request that will be sent to a server when data changes about a person.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhooks"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookAttributes"
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "replay",
+              "webhookFilters",
+              "webhookRelationshipFilters"
+            ],
+            "properties": {
+              "replay": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              },
+              "webhookFilters": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "webhookRelationshipFilters": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "replayWebhookRequestAttributes": {
+        "type": "object",
+        "required": [
+          "replayFromTime"
+        ],
+        "properties": {
+          "replayFromTime": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2019-01-01T00:00:00Z",
+            "description": "The time to start replaying events from. This is an ISO 8601 date and time with the following format : YYYY-MM-DDTHH:MM:SSZ. The time must be in UTC."
+          }
+        }
+      },
+      "webhookFilterAttributes": {
+        "type": "object",
+        "required": [
+          "attribute",
+          "operator",
+          "values"
+        ],
+        "properties": {
+          "attribute": {
+            "type": "string",
+            "example": "jobs.divisionCode",
+            "description": "A valid attribute or relationship attribute on the people resource."
+          },
+          "operator": {
+            "type": "string",
+            "example": "STARTS_WITH",
+            "description": "The comparison to be performed on the balues. Valid operators are - 'STARTS_WITH', 'ENDS_WITH', 'CONTAINS', or 'EQUALS'."
+          },
+          "values": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "example": [
+              "A192",
+              "A193"
+            ],
+            "description": "A list of values to compare against. Values are required and must be a list of upto 10 non-empty strings."
+          }
+        }
+      },
+      "webhookFilters": {
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhookFilters"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookFilterAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "webhook"
+            ],
+            "properties": {
+              "webhook": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      },
+      "webhookRelationshipFilterAttributes": {
+        "type": "object",
+        "required": [
+          "relationship"
+        ],
+        "properties": {
+          "relationship": {
+            "type": "string",
+            "example": "jobs",
+            "description": "A valid relationship on the people resource.  If there are no changes to this relationship in a webhook event, the webhook event won't be sent to you."
+          }
+        }
+      },
+      "webhookRelationshipFilters": {
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhookRelationshipFilters"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "webhook"
+            ],
+            "properties": {
+              "webhook": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      }
+    },
+    "requestBodies": {
+      "newName": {
+        "description": "A name request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "names"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/nameAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updatedName": {
+        "description": "A name request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "id",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "names"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/nameAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhook": {
+        "description": "A webhook request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhooks"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updatedWebhook": {
+        "description": "A webhook request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "id"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhooks"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "replayWebhook": {
+        "description": "A webhook replay request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "replay"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/replayWebhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhookFilter": {
+        "description": "A webhook filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookFilters"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updateWebhookFilter": {
+        "description": "A webhook filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookFilters"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhookRelationshipFilter": {
+        "description": "A webhook relationship filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookRelationshipFilters"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updateWebhookRelationshipFilter": {
+        "description": "A webhook relationship filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookRelationshipFilters"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "responses": {
+      "people": {
+        "description": "A collection of people",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of people",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/people"
+                  }
+                },
+                "links": {
+                  "description": "Self and pagination links",
+                  "allOf": [
+                    {
+                      "$ref": "#/components/schemas/selfLink"
+                    },
+                    {
+                      "$ref": "#/components/schemas/pagination"
+                    }
+                  ]
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-people": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "emailAddress": "john.smith@wisc.edu",
+                        "firstName": "John",
+                        "lastName": "Smith",
+                        "officeAddress": "1210 W Dayton St, Madison, WI 53706",
+                        "officePhoneNumber": "608-555-1234"
+                      },
+                      "id": "100",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/100"
+                      },
+                      "meta": {
+                        "ferpa": false,
+                        "ferpaAttributes": [],
+                        "privateAttributes": []
+                      },
+                      "relationships": {
+                        "identifiers": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "identifiers"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/identifiers"
+                          }
+                        },
+                        "jobs": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "jobs"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/jobs"
+                          }
+                        },
+                        "names": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "names"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/names"
+                          }
+                        },
+                        "wiscard": {
+                          "data": {
+                            "id": "100",
+                            "type": "wiscard"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/wiscard"
+                          }
+                        }
+                      },
+                      "type": "people"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "people-id": {
+        "description": "A single person",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/people"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-people": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "emailAddress": "john.smith@wisc.edu",
+                      "firstName": "John",
+                      "lastName": "Smith",
+                      "officeAddress": "1210 W Dayton St, Madison, WI 53706",
+                      "officePhoneNumber": "608-555-1234"
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/100"
+                    },
+                    "meta": {
+                      "ferpa": false
+                    },
+                    "relationships": {
+                      "identifiers": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "identifiers"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/identifiers"
+                        }
+                      },
+                      "jobs": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "jobs"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/jobs"
+                        }
+                      },
+                      "names": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "names"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/names"
+                        }
+                      },
+                      "wiscard": {
+                        "data": {
+                          "id": "100",
+                          "type": "wiscard"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/wiscard"
+                        }
+                      }
+                    },
+                    "type": "people"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "identifiers": {
+        "description": "A collection of identifiers.  These may be: `pvi` (Publicly Visible Identifier, a unique value from DoIT Identity and Access Management), `netId` (username for the NetID Login Service), `photoId` (from a person's Wiscard), or `emplId` (from Human Resources System - HRS - for employees, or from Student Information System - SIS -for students).",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of identifiers",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/identifiers"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-identifiers-current": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "name": "pvi",
+                        "source": "IAM",
+                        "value": "UW123A456",
+                        "current": true
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "identifiers"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/identifiers"
+                  }
+                }
+              },
+              "example-identifier-historical": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "name": "pvi",
+                        "source": "IAM",
+                        "value": "UW123A123",
+                        "current": false
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "identifiers"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/identifiers"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "jobs": {
+        "description": "A collection of jobs",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of jobs",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/jobs"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-jobs": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "departmentUnit": "DOIT/AIS/ENTERPRISE INTEGRAT",
+                        "division": "INFORMATION TECHNOLOGY",
+                        "divisionCode": "A067040",
+                        "title": "Product Manager",
+                        "beginDate": "2020-01-01",
+                        "endDate": "2080-01-01",
+                        "effectiveDate": "2020-01-01",
+                        "fullTimeEquivalent": "1",
+                        "payBasis": "Annual",
+                        "employeeCategory": "Academic Staff",
+                        "employeeCategoryCode": "AS",
+                        "jobCode": "IT002",
+                        "businessTitle": "Department Product Manager",
+                        "position": "00123456-1",
+                        "current": true
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        },
+                        "supervisor": {
+                          "data": {
+                            "id": "200",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/200"
+                          }
+                        }
+                      },
+                      "type": "jobs"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/jobs"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "wiscard": {
+        "description": "Details and metadata about a person's Wiscard.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/wiscard"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-wiscard": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "wiscardId": "1234567890",
+                      "issueCode": "0",
+                      "expirationDate": "2122-07-01"
+                    },
+                    "id": "100",
+                    "relationships": {
+                      "person": {
+                        "data": {
+                          "id": "100",
+                          "type": "people"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100"
+                        }
+                      }
+                    },
+                    "type": "wiscard"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/wiscard"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "names": {
+        "description": "A collection of names.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of names",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/names"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-names": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "firstName": "Amy",
+                        "middleName": "Marie",
+                        "lastName": "Smith",
+                        "nameType": "nameInUse",
+                        "source": "profile"
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "names",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/100/names/200"
+                      }
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/names"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleName": {
+        "description": "A single name.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/names"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-names": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "firstName": "Amy",
+                      "middleName": "Marie",
+                      "lastName": "Smith",
+                      "nameType": "nameInUse",
+                      "source": "profile"
+                    },
+                    "id": "100",
+                    "relationships": {
+                      "person": {
+                        "data": {
+                          "id": "100",
+                          "type": "people"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100"
+                        }
+                      }
+                    },
+                    "type": "names",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/100/names/200"
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/names/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhooks": {
+        "description": "A collection of webhooks.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhooks.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhooks"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhooks": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "url": "https://department.wisc.edu/person-api-webhook",
+                        "expired": false
+                      },
+                      "id": "100",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100"
+                      },
+                      "type": "webhooks",
+                      "relationships": {
+                        "replay": {
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                          }
+                        },
+                        "webhookFilters": {
+                          "data": [],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                          }
+                        },
+                        "webhookRelationshipFilters": {
+                          "data": [],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                          }
+                        }
+                      }
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhook": {
+        "description": "A single webhook.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhooks"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhook": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "url": "https://department.wisc.edu/person-api-webhook",
+                      "expired": false
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100"
+                    },
+                    "type": "webhooks",
+                    "relationships": {
+                      "replay": {
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                        }
+                      },
+                      "webhookFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                        }
+                      },
+                      "webhookRelationshipFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                        }
+                      }
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "createdWebhook": {
+        "description": "A single just created webhook.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhooks"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhook": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "url": "https://department.wisc.edu/person-api-webhook",
+                      "token": "16f6f440-7317-41f2-9239-6207519b3ad0",
+                      "expired": false
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100"
+                    },
+                    "type": "webhooks",
+                    "relationships": {
+                      "replay": {
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                        }
+                      },
+                      "webhookFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                        }
+                      },
+                      "webhookRelationshipFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                        }
+                      }
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhookFilters": {
+        "description": "A collection of webhook filters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhook filters.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhookFilters"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilters": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "attribute": "firstName",
+                        "operator": "STARTS_WITH",
+                        "values": [
+                          "Ben",
+                          "Ber",
+                          "Bel",
+                          "Bes"
+                        ]
+                      },
+                      "id": "123",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100/filters/123"
+                      },
+                      "relationships": {
+                        "webhook": {
+                          "data": {
+                            "id": "100",
+                            "type": "webhooks"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100"
+                          }
+                        }
+                      },
+                      "type": "webhookFilters"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/filters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhookFilter": {
+        "description": "A single webhook filter.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhookFilters"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilter": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "attribute": "firstName",
+                      "operator": "STARTS_WITH",
+                      "values": [
+                        "Ben",
+                        "Ber",
+                        "Bel",
+                        "Bes"
+                      ]
+                    },
+                    "id": "123",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100/filters/123"
+                    },
+                    "relationships": {
+                      "webhook": {
+                        "data": {
+                          "id": "100",
+                          "type": "webhooks"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100"
+                        }
+                      }
+                    },
+                    "type": "webhookFilters"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/filters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhookRelationshipFilters": {
+        "description": "A collection of webhook relationship filters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhook filters.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhookRelationshipFilters"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookRelationshipFilters": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "relationship": "identifiers"
+                      },
+                      "id": "123",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters/123"
+                      },
+                      "relationships": {
+                        "webhook": {
+                          "data": {
+                            "id": "100",
+                            "type": "webhooks"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100"
+                          }
+                        }
+                      },
+                      "type": "webhookRelationshipFilters"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhookRelationshipFilter": {
+        "description": "A single webhook relationship filter.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhookRelationshipFilters"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilter": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "relationship": "identifiers"
+                    },
+                    "id": "123",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters/123"
+                    },
+                    "relationships": {
+                      "webhook": {
+                        "data": {
+                          "id": "100",
+                          "type": "webhooks"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100"
+                        }
+                      }
+                    },
+                    "type": "webhookRelationshipFilters"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "not-found": {
+        "description": "Unable to find the specified record",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 404,
+                      "title": "Not Found",
+                      "detail": "Requested resource not found."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "not-acceptable": {
+        "description": "Servers respond with a 406 Not Acceptable status code if a request’s Accept header contains the JSON:API media type and all instances of that media type are modified with media type parameters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-acceptable-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 406,
+                      "title": "Not Acceptable",
+                      "detail": "Request's Accept header contained the JSON:API media type and all instances of that media type were modified with media type parameters."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "unsupported-media-type": {
+        "description": "Request includes a body but not the valid JSON API Content-Type header: application/vnd.api+json",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "unsupported-media-type-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 415,
+                      "title": "Unsupported Media Type",
+                      "detail": "Requests with a body must include the Content-Type header with a value of application/vnd.api+json"
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "forbidden": {
+        "description": "The API call is authenticated but the client isn't allowed to perform the requested operation. This can occur when trying to update a resource when granted read-only access.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "name-update-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 403,
+                      "title": "Forbidden",
+                      "detail": "Client is not allowed to create, update, or delete a person's name."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "too-many-requests": {
+        "description": "The API quota has been exceeded.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 429,
+                      "title": "Too Many Requests",
+                      "detail": "The quota has been exceeded."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "unauthorized": {
+        "description": "Incorrect or expired OAuth token.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "unauthorized-response": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 401,
+                      "title": "Unauthorized",
+                      "detail": "Invalid OAuth authentication - InvalidAccessToken"
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "internal-server-error": {
+        "description": "An unexpected error.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 500,
+                      "title": "Internal Server Error",
+                      "detail": "Something went wrong in the server-side."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "bad-request": {
+        "description": "A bad request.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "application/vnd.api+json": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 400,
+                      "title": "Bad Request",
+                      "detail": "Invalid properties in query parameters - resource type 'people' has no attribute 'invalid'."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "parameters": {
+      "id": {
+        "name": "id",
+        "description": "ID of a person. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response. To get a person by an ID, use query parameters to search by a specific identifier. Example: /people?filter[identifiers.name]=netId&filter[identifiers.value]=bbadger",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+				"personId": {
+				"type": "string",
+				"description": "An ephemeral identifier used only in the Person API to adhere to the [JSON:API specification](https://jsonapi.org/format/#document-resource-object-identification). This ID may change if a person is split into two people or two people are merged into one person. This ID is used for paginating results or following other links returned in the API response. This ID should not be stored in a consuming system. Concatenating parts of the URL to form a link is discouraged. Instead, use the fully-formed links returned in an API response.",
+				"example": "12345"
+			}
+          }
+        }
+      },
+      "nameId": {
+        "name": "nameId",
+        "description": "ID of a name. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "101",
+        "required": true,
+        "schema": {
+            "type": "object",
+          "properties": {
+				 "genericId": {
+				"type": "string",
+				"example": "12345",
+				"description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+				}
+          }
+        }
+      },
+      "webhookId": {
+        "name": "webhookId",
+        "description": "ID of a webhook. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+				 "genericId": {
+				"type": "string",
+				"example": "12345",
+				"description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+				}
+          }
+        }
+      },
+      "filterId": {
+        "name": "filterId",
+        "description": "ID of a webhook filter. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+				 "genericId": {
+				"type": "string",
+				"example": "12345",
+				"description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+				}
+          }
+        }
+      },
+      "relationshipFilterId": {
+        "name": "relationshipFilterId",
+        "description": "ID of a webhook relationship filter. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+				 "genericId": {
+				"type": "string",
+				"example": "12345",
+				"description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+				}
+          }
+        }
+      },
+      "filter": {
+        "name": "filter",
+        "in": "query",
+        "description": "Filter results of query using the [filter query parameter family](https://jsonapi.org/recommendations/#filtering). Refer to the [Person API Documentation](/person-api/filter-query-parameter) for more information about the `filter` query param.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "attribute": {
+              "type": "string",
+              "example": "firstName"
+            }
+          }
+        }
+      },
+      "include": {
+        "name": "include",
+        "in": "query",
+        "description": "[include related resources](https://jsonapi.org/format/#fetching-includes). The resources to include need to be direct relationships. Nested relationships are not supported. For example, `include=jobs,identifiers` is supported but `include=person.jobs` is not supported.",
+        "schema": {
+          "type": "string"
+        }
+      },
+      "fields": {
+        "name": "fields",
+        "in": "query",
+        "description": "Specify the list of fields you would like to return for each resource type.  For example, `fields[people]=firstName,lastName` will just return the names for people.  If you are including related resources with 'includes' you can also specify fields on those resources as well.  For example, `includes=jobs&fields[people]=jobs&fields[jobs]=title` will just return titles for jobs.  See [Sparse Fieldsets](https://jsonapi.org/format/#fetching-sparse-fieldsets) for more details.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "type": {
+              "type": "string",
+              "example": "people"
+            }
+          }
+        }
+      },
+      "page": {
+        "name": "page",
+        "in": "query",
+        "description": "Define options for pagination of responses. For example, `page[size]=5&page[after]=400&page[before]=800` will return a response with data about 5 people whose `id` value falls after `400` but before `800`. So `page[size]` determines the number of people resources in a response, `page[after]` is the ID of the person at the end of the previous page, `page[before]` is the ID of the person at the start of the next page.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+            "size": {
+              "type": "integer",
+              "example": 50,
+              "description": "Size of page for paginated results."
+            },
+            "after": {
+              "$ref": "#/components/schemas/personId"
+            },
+            "before": {
+              "$ref": "#/components/schemas/personId"
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/MockAPI_GetPeople.json b/MockAPI_GetPeople.json
new file mode 100644
index 0000000000000000000000000000000000000000..71c4af1e144d623f2d9893fe3d1c1a1417a72a5a
--- /dev/null
+++ b/MockAPI_GetPeople.json
@@ -0,0 +1,257 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : null,
+    "version" : "1.0.0",
+    "title" : null,
+    "termsOfService" : null,
+    "contact" : null,
+    "license" : null
+  },
+  "host" : "mock.api.wisc.edu",
+  "basePath" : "/",
+  "schemes" : [ "https" ],
+  "paths" : {
+    "/People" : {
+      "get" : {
+        "tags" : [ "SAS_MockAPI_GetPeople" ],
+        "summary" : null,
+        "description" : null,
+        "operationId" : "SAS_MockAPI_GetPeople",
+        "produces" : [ "application/json" ],
+        "consumes" : [ "application/json" ],
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/SAS_MockAPI_GetPeople"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions" : {
+    "SAS_MockAPI_GetPeople##data##attributes" : {
+      "properties" : {
+        "emailAddress" : {
+          "type" : "string"
+        },
+        "firstName" : {
+          "type" : "string"
+        },
+        "lastName" : {
+          "type" : "string"
+        },
+        "officeAddress" : {
+          "type" : "string"
+        },
+        "officePhoneNumber" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##meta" : {
+      "properties" : {
+        "ferpa" : {
+          "type" : "boolean"
+        },
+        "ferpaAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        },
+        "privateAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##identifiers##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##identifiers##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##identifiers" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##identifiers##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##identifiers##links"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##jobs##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##jobs##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##jobs" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##jobs##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##jobs##links"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##names##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##names##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##names" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##names##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##names##links"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##wiscard##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##wiscard" : {
+      "properties" : {
+        "data" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##wiscard##links"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships" : {
+      "properties" : {
+        "identifiers" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##identifiers"
+        },
+        "jobs" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##jobs"
+        },
+        "names" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##names"
+        },
+        "wiscard" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships##wiscard"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data##relationships##wiscard##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##data" : {
+      "properties" : {
+        "attributes" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##attributes"
+        },
+        "id" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##meta"
+        },
+        "relationships" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data##relationships"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "SAS_MockAPI_GetPeople" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/SAS_MockAPI_GetPeople##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/SAS_MockAPI_GetPeople##links"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/MockAPI_GetPeople_2.json b/MockAPI_GetPeople_2.json
new file mode 100644
index 0000000000000000000000000000000000000000..32adc4e294937d757d4010f0e20b074ded64f09e
--- /dev/null
+++ b/MockAPI_GetPeople_2.json
@@ -0,0 +1,257 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : null,
+    "version" : "1.0.0",
+    "title" : null,
+    "termsOfService" : null,
+    "contact" : null,
+    "license" : null
+  },
+  "host" : "mock.api.wisc.edu",
+  "basePath" : "/people",
+  "schemes" : [ "https" ],
+  "paths" : {
+    "/" : {
+      "get" : {
+        "tags" : [ "GetPeople" ],
+        "summary" : null,
+        "description" : null,
+        "operationId" : "GetPeople",
+        "produces" : [ "application/json" ],
+        "consumes" : [ "application/json" ],
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/GetPeople"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions" : {
+    "GetPeople##data##attributes" : {
+      "properties" : {
+        "emailAddress" : {
+          "type" : "string"
+        },
+        "firstName" : {
+          "type" : "string"
+        },
+        "lastName" : {
+          "type" : "string"
+        },
+        "officeAddress" : {
+          "type" : "string"
+        },
+        "officePhoneNumber" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##meta" : {
+      "properties" : {
+        "ferpa" : {
+          "type" : "boolean"
+        },
+        "ferpaAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        },
+        "privateAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        }
+      }
+    },
+    "GetPeople##data##relationships##identifiers##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##identifiers##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##identifiers" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/GetPeople##data##relationships##identifiers##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##identifiers##links"
+        }
+      }
+    },
+    "GetPeople##data##relationships##jobs##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##jobs##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##jobs" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/GetPeople##data##relationships##jobs##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##jobs##links"
+        }
+      }
+    },
+    "GetPeople##data##relationships##names##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##names##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##names" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/GetPeople##data##relationships##names##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##names##links"
+        }
+      }
+    },
+    "GetPeople##data##relationships##wiscard##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data##relationships##wiscard" : {
+      "properties" : {
+        "data" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##wiscard##links"
+        }
+      }
+    },
+    "GetPeople##data##relationships" : {
+      "properties" : {
+        "identifiers" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##identifiers"
+        },
+        "jobs" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##jobs"
+        },
+        "names" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##names"
+        },
+        "wiscard" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships##wiscard"
+        }
+      }
+    },
+    "GetPeople##data##relationships##wiscard##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##data" : {
+      "properties" : {
+        "attributes" : {
+          "$ref" : "#/definitions/GetPeople##data##attributes"
+        },
+        "id" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##data##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/GetPeople##data##meta"
+        },
+        "relationships" : {
+          "$ref" : "#/definitions/GetPeople##data##relationships"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "GetPeople" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/GetPeople##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/GetPeople##links"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/get+people_2_.json b/get+people_2_.json
new file mode 100644
index 0000000000000000000000000000000000000000..74f52b7540ed40ac1aa29f13460217e876da9d6e
--- /dev/null
+++ b/get+people_2_.json
@@ -0,0 +1,200 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : null,
+    "version" : "1.0.0",
+    "title" : null,
+    "termsOfService" : null,
+    "contact" : null,
+    "license" : null
+  },
+  "host" : "mock.api.wisc.edu",
+  "basePath" : "/",
+  "schemes" : [ "https" ],
+  "paths" : {
+    "/people" : {
+      "get" : {
+        "tags" : [ "get people" ],
+        "summary" : null,
+        "description" : null,
+        "operationId" : "get people",
+        "produces" : [ "application/json" ],
+        "consumes" : [ "application/json" ],
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/get people"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions" : {
+    "get people##data##attributes" : {
+      "properties" : {
+        "emailAddress" : {
+          "type" : "string"
+        },
+        "firstName" : {
+          "type" : "string"
+        },
+        "lastName" : {
+          "type" : "string"
+        },
+        "officeAddress" : {
+          "type" : "string"
+        },
+        "officePhoneNumber" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##meta" : {
+      "properties" : {
+        "ferpa" : {
+          "type" : "boolean"
+        },
+        "ferpaAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        },
+        "privateAttributes" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        }
+      }
+    },
+    "get people##data##relationships##identifiers##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##relationships##identifiers##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##relationships##identifiers" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/get people##data##relationships##identifiers##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/get people##data##relationships##identifiers##links"
+        }
+      }
+    },
+    "get people##data##relationships##jobs##data" : {
+      "properties" : {
+        "id" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##relationships##jobs##links" : {
+      "properties" : {
+        "related" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##data##relationships##jobs" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/get people##data##relationships##jobs##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/get people##data##relationships##jobs##links"
+        }
+      }
+    },
+    "get people##data##relationships" : {
+      "properties" : {
+        "identifiers" : {
+          "$ref" : "#/definitions/get people##data##relationships##identifiers"
+        },
+        "jobs" : {
+          "$ref" : "#/definitions/get people##data##relationships##jobs"
+        }
+      }
+    },
+    "get people##data" : {
+      "properties" : {
+        "attributes" : {
+          "$ref" : "#/definitions/get people##data##attributes"
+        },
+        "id" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/get people##data##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/get people##data##meta"
+        },
+        "relationships" : {
+          "$ref" : "#/definitions/get people##data##relationships"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people##links" : {
+      "properties" : {
+        "next" : {
+          "type" : "string"
+        },
+        "prev" : {
+          "type" : "string"
+        },
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "get people" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/get people##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/get people##links"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/getcostcenter.json b/getcostcenter.json
new file mode 100644
index 0000000000000000000000000000000000000000..d130464ca92a5ac0d0760b81e6f09fe4922df22d
--- /dev/null
+++ b/getcostcenter.json
@@ -0,0 +1,138 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : null,
+    "version" : "1.0.0",
+    "title" : null,
+    "termsOfService" : null,
+    "contact" : null,
+    "license" : null
+  },
+  "host" : "api.wisc.edu",
+  "basePath" : "/finance",
+  "schemes" : [ "https" ],
+  "paths" : {
+    "/costCenters" : {
+      "get" : {
+        "tags" : [ "getcostcenter" ],
+        "summary" : null,
+        "description" : null,
+        "operationId" : "getcostcenter",
+        "produces" : [ "application/json" ],
+        "consumes" : [ "application/json" ],
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/getcostcenter"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions" : {
+    "getcostcenter##data##attributes" : {
+      "properties" : {
+        "active" : {
+          "type" : "boolean"
+        },
+        "company" : {
+          "type" : "string"
+        },
+        "name" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getcostcenter##data##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getcostcenter##data##meta" : {
+      "properties" : {
+        "dttm_loaded" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getcostcenter##data" : {
+      "properties" : {
+        "attributes" : {
+          "$ref" : "#/definitions/getcostcenter##data##attributes"
+        },
+        "id" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/getcostcenter##data##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/getcostcenter##data##meta"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getcostcenter##links" : {
+      "properties" : {
+        "first" : {
+          "type" : "string"
+        },
+        "last" : {
+          "type" : "string"
+        },
+        "next" : {
+          "type" : "string"
+        },
+        "prev" : {
+          "type" : "string"
+        },
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getcostcenter##meta" : {
+      "properties" : {
+        "pageNumber" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "pageSize" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "totalCount" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "totalPages" : {
+          "type" : "number",
+          "format" : "int32"
+        }
+      }
+    },
+    "getcostcenter" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/getcostcenter##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/getcostcenter##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/getcostcenter##meta"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/getfundinfo.json b/getfundinfo.json
new file mode 100644
index 0000000000000000000000000000000000000000..9a74743f5031ee185b05953dc69d654c84b0d2ac
--- /dev/null
+++ b/getfundinfo.json
@@ -0,0 +1,135 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : null,
+    "version" : "1.0.0",
+    "title" : null,
+    "termsOfService" : null,
+    "contact" : null,
+    "license" : null
+  },
+  "host" : "api.wisc.edu",
+  "basePath" : "/finance",
+  "schemes" : [ "https" ],
+  "paths" : {
+    "/funds" : {
+      "get" : {
+        "tags" : [ "getfundinfo" ],
+        "summary" : null,
+        "description" : null,
+        "operationId" : "getfundinfo",
+        "produces" : [ "application/json" ],
+        "consumes" : [ "application/json" ],
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/getfundinfo"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions" : {
+    "getfundinfo##data##attributes" : {
+      "properties" : {
+        "active" : {
+          "type" : "boolean"
+        },
+        "name" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getfundinfo##data##links" : {
+      "properties" : {
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getfundinfo##data##meta" : {
+      "properties" : {
+        "dttm_loaded" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getfundinfo##data" : {
+      "properties" : {
+        "attributes" : {
+          "$ref" : "#/definitions/getfundinfo##data##attributes"
+        },
+        "id" : {
+          "type" : "string"
+        },
+        "links" : {
+          "$ref" : "#/definitions/getfundinfo##data##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/getfundinfo##data##meta"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getfundinfo##links" : {
+      "properties" : {
+        "first" : {
+          "type" : "string"
+        },
+        "last" : {
+          "type" : "string"
+        },
+        "next" : {
+          "type" : "string"
+        },
+        "prev" : {
+          "type" : "string"
+        },
+        "self" : {
+          "type" : "string"
+        }
+      }
+    },
+    "getfundinfo##meta" : {
+      "properties" : {
+        "pageNumber" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "pageSize" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "totalCount" : {
+          "type" : "number",
+          "format" : "int32"
+        },
+        "totalPages" : {
+          "type" : "number",
+          "format" : "int32"
+        }
+      }
+    },
+    "getfundinfo" : {
+      "properties" : {
+        "data" : {
+          "type" : "array",
+          "items" : {
+            "$ref" : "#/definitions/getfundinfo##data"
+          }
+        },
+        "links" : {
+          "$ref" : "#/definitions/getfundinfo##links"
+        },
+        "meta" : {
+          "$ref" : "#/definitions/getfundinfo##meta"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/swagger.json b/swagger.json
new file mode 100644
index 0000000000000000000000000000000000000000..16a79b625366d102052e3a5bd0e10fb6683716d8
--- /dev/null
+++ b/swagger.json
@@ -0,0 +1,3556 @@
+{
+  "openapi": "3.0.2",
+  "info": {
+    "title": "Person API",
+    "version": "1.0.0",
+    "contact": {
+      "name": "DoIT Enterprise Integration API Team",
+      "email": "api@doit.wisc.edu",
+      "url": "https://go.wisc.edu/k701y6"
+    },
+    "description": "An API for interacting with person data at UW-Madison. Refer to the [Person API Documentation](/person-api) for more information about this API."
+  },
+  "externalDocs": {
+    "description": "Read more about JSON:API here",
+    "url": "https://jsonapi.org/"
+  },
+  "servers": [
+    {
+      "url": "https://api.wisc.edu"
+    }
+  ],
+  "security": [
+    {
+      "OAuth2ClientCredentials": []
+    }
+  ],
+  "paths": {
+    "/people": {
+      "get": {
+        "description": "Get a collection of people.",
+        "summary": "Get people.",
+        "operationId": "get_people",
+        "tags": [
+          "people"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/filter"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          },
+          {
+            "$ref": "#/components/parameters/page"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/people"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}": {
+      "get": {
+        "description": "Get a person. It is not recommended to manually build this URL or other URLs that contain path parameters, for example, by using concatenation. Instead, use the fully-qualified links returned in other resources to use this resource and other \"Get By ID\" resources.",
+        "summary": "Get a person.",
+        "operationId": "get_person",
+        "tags": [
+          "people"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/people-id"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/identifiers": {
+      "get": {
+        "description": "Get identifiers for a person. This endpoint returns all current and past identifiers for the person..",
+        "summary": "Get identifiers.",
+        "operationId": "get_person_identifiers",
+        "tags": [
+          "identifiers"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/filter"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/identifiers"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/jobs": {
+      "get": {
+        "description": "Get jobs for a person.",
+        "summary": "Get jobs.",
+        "operationId": "get_person_jobs",
+        "tags": [
+          "jobs"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          },
+          {
+            "$ref": "#/components/parameters/filter"
+          },
+          {
+            "$ref": "#/components/parameters/include"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/jobs"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/wiscard": {
+      "get": {
+        "description": "Details and metadata about a person's Wiscard.",
+        "summary": "Get Wiscard.",
+        "operationId": "get_person_wiscard",
+        "tags": [
+          "wiscard"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/wiscard"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/names": {
+      "get": {
+        "description": "Get a person's names, split into separate resource objects depending on the type of name.",
+        "summary": "Get names.",
+        "operationId": "get_person_names",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/fields"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/names"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Create a name for a person. Only names with `nameType` of `nameInUse` can be created. Client-generated IDs are not supported.",
+        "summary": "Create a name.",
+        "operationId": "create_person_name",
+        "tags": [
+          "names"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newName"
+        },
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "202": {
+            "description": "Name created, but additional processing is needed for it to show in the API."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/{id}/names/{nameId}": {
+      "get": {
+        "description": "Get a name by ID.",
+        "summary": "Get a name.",
+        "operationId": "get_person_name",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Update a name for a person. Only names with `nameType` of `nameInUse` can be updated. Updating the ID is not allowed.",
+        "summary": "Update a name.",
+        "operationId": "update_person_name",
+        "tags": [
+          "names"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updatedName"
+        },
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleName"
+          },
+          "202": {
+            "description": "Name updated, but additional processing is needed for the updates to show in the API."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Please contact api@doit.wisc.edu if you need access to this endpoint. Delete a name for a person. Only names with `nameType` of `nameInUse` can be deleted.",
+        "summary": "Delete a name.",
+        "operationId": "delete_person_name",
+        "tags": [
+          "names"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/id"
+          },
+          {
+            "$ref": "#/components/parameters/nameId"
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Name deleted, but additional processing is needed before the name won't appear in the API."
+          },
+          "204": {
+            "description": "Name deleted. Empty response."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks": {
+      "get": {
+        "description": "Get a collection of webhooks. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get webhooks.",
+        "operationId": "get_webhooks",
+        "tags": [
+          "webhooks"
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhooks"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a webhook. A maximum of 1 webhook per Developer Portal application is allowed. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a webhook.",
+        "operationId": "create_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhook"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/createdWebhook"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "403": {
+            "$ref": "#/components/responses/forbidden"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}": {
+      "get": {
+        "description": "Get a single webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a webhook.",
+        "operationId": "get_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhook"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a webhook.",
+        "operationId": "update_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updatedWebhook"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhook"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a webhook.",
+        "operationId": "delete_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Webhook deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/replay": {
+      "post": {
+        "description": "Replay events for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Replay events.",
+        "operationId": "replay_events_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/replayWebhook"
+        },
+        "responses": {
+          "202": {
+            "description": "Webhook replayed. Empty response."
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/filters": {
+      "get": {
+        "description": "Get all filters for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get all filters for a webhook.",
+        "operationId": "get_all_filters_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhookFilters"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a filter for a webhook.",
+        "operationId": "create_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhookFilter"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/filters/{filterId}": {
+      "get": {
+        "description": "Get a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a filter for a webhook.",
+        "operationId": "get_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a filter for a webhook.",
+        "operationId": "update_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updateWebhookFilter"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a filter for a webhook.",
+        "operationId": "delete_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/filterId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Name deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/relationshipFilters": {
+      "get": {
+        "description": "Get all relationship filters for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get all relationship filters for a webhook.",
+        "operationId": "get_all_relationship_filters_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/webhookRelationshipFilters"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "post": {
+        "description": "Create a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Create a relationship filter for a webhook.",
+        "operationId": "create_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/newWebhookRelationshipFilter"
+        },
+        "responses": {
+          "201": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    },
+    "/people/webhooks/{webhookId}/relationshipFilters/{relationshipFilterId}": {
+      "get": {
+        "description": "Get a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Get a relationship filter for a webhook.",
+        "operationId": "get_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "patch": {
+        "description": "Update a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Update a relationship filter for a webhook.",
+        "operationId": "update_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "requestBody": {
+          "$ref": "#/components/requestBodies/updateWebhookRelationshipFilter"
+        },
+        "responses": {
+          "200": {
+            "$ref": "#/components/responses/singleWebhookRelationshipFilter"
+          },
+          "400": {
+            "$ref": "#/components/responses/bad-request"
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "415": {
+            "$ref": "#/components/responses/unsupported-media-type"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      },
+      "delete": {
+        "description": "Delete a relationship filter for a webhook. Refer to the [Webhook Documentation](/person-api/webhooks) for more information.",
+        "summary": "Delete a relationship filter for a webhook.",
+        "operationId": "delete_relationship_filter_for_webhook",
+        "tags": [
+          "webhooks"
+        ],
+        "parameters": [
+          {
+            "$ref": "#/components/parameters/webhookId"
+          },
+          {
+            "$ref": "#/components/parameters/relationshipFilterId"
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Webhook relationship filter deleted. Empty response."
+          },
+          "401": {
+            "$ref": "#/components/responses/unauthorized"
+          },
+          "404": {
+            "$ref": "#/components/responses/not-found"
+          },
+          "406": {
+            "$ref": "#/components/responses/not-acceptable"
+          },
+          "429": {
+            "$ref": "#/components/responses/too-many-requests"
+          },
+          "500": {
+            "$ref": "#/components/responses/internal-server-error"
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "securitySchemes": {
+      "OAuth2ClientCredentials": {
+        "type": "oauth2",
+        "flows": {
+          "clientCredentials": {
+            "tokenUrl": "https://api.wisc.edu/oauth/token",
+            "scopes": {}
+          }
+        }
+      }
+    },
+    "schemas": {
+      "people": {
+        "description": "A person",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships",
+          "links",
+          "meta"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "people"
+          },
+          "id": {
+            "$ref": "#/components/schemas/personId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "firstName",
+              "lastName",
+              "emailAddress",
+              "officeAddress",
+              "officePhoneNumber"
+            ],
+            "properties": {
+              "firstName": {
+                "type": "string",
+                "example": "John",
+                "description": "First name, derived from the person's current UW affiliations."
+              },
+              "lastName": {
+                "type": "string",
+                "example": "Smith",
+                "description": "Last name, derived from the person's current UW affiliations."
+              },
+              "emailAddress": {
+                "type": "string",
+                "example": "john.smith@wisc.edu",
+                "description": "The email address this person has designated as their primary, if set.  Otherwise, their Campus Business Email, or other email derived from their current UW affiliations."
+              },
+              "officeAddress": {
+                "type": "string",
+                "description": "Primary work-related address derived from the person's current UW affiliations.  May or may not be a fully-formed street address.",
+                "example": "1210 W. Dayton Street Madison, WI 53706-1613"
+              },
+              "officePhoneNumber": {
+                "type": "string",
+                "example": "608-262-1204",
+                "description": "Primary work-related phone number derived from the person's current UW affiliations.  May or may not be associated with the officeAddress."
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "identifiers",
+              "jobs",
+              "names",
+              "wiscard"
+            ],
+            "properties": {
+              "identifiers": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "jobs": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "names": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "wiscard": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "meta": {
+            "type": "object",
+            "properties": {
+              "ferpa": {
+                "type": "boolean",
+                "example": false,
+                "description": "Indicates whether or not a student has elected FERPA coverage on one or more of their attributes. Please see https://registrar.wisc.edu/ferpa/ for more details about how to handle FERPA data."
+              },
+              "ferpaAttributes": {
+                "type": "array",
+                "items": {
+                  "type": "string"
+                },
+                "description": "Not currently used."
+              },
+              "privateAttributes": {
+                "type": "array",
+                "items": {
+                  "type": "string"
+                },
+                "description": "Not currently used."
+              }
+            }
+          }
+        }
+      },
+      "identifierAttributes": {
+        "type": "object",
+        "required": [
+          "name",
+          "source",
+          "value",
+          "current"
+        ],
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "pvi",
+            "description": "The name of this identifier. We currently support pvi, netId, emplId, and photoId."
+          },
+          "source": {
+            "type": "string",
+            "example": "IAM",
+            "description": "The source of this identifier. We have identifiers from IAM, HRS, SIS, and WISCARD."
+          },
+          "value": {
+            "type": "string",
+            "example": "UW123A456"
+          },
+          "current": {
+            "description": "Property that indicates if this identifier is currently used.",
+            "type": "boolean",
+            "example": true
+          }
+        }
+      },
+      "identifiers": {
+        "description": "An identifier",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "identifiers"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/identifierAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "jobs": {
+        "description": "A job",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "jobs"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "title",
+              "division",
+              "divisionCode",
+              "departmentUnit",
+              "beginDate",
+              "endDate",
+              "effectiveDate",
+              "fullTimeEquivalent",
+              "payBasis",
+              "employeeCategoryCode",
+              "employeeCategory",
+              "jobCode",
+              "businessTitle"
+            ],
+            "properties": {
+              "title": {
+                "type": "string",
+                "example": "Software Eng/Developer I",
+                "description": "Title of the person's position at this job."
+              },
+              "division": {
+                "type": "string",
+                "example": "INFORMATION TECHNOLOGY",
+                "description": "High level organizational unit where the job is located."
+              },
+              "divisionCode": {
+                "type": "string",
+                "example": "A067040",
+                "description": "Code for the location of the job."
+              },
+              "departmentUnit": {
+                "type": "string",
+                "example": "L&S/COMPUTER SCI/COMP SCI",
+                "description": "Organization path where the job is located."
+              },
+              "beginDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2018-01-01",
+                "description": "The date the job began."
+              },
+              "endDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2025-01-01",
+                "description": "The date the job ended."
+              },
+              "effectiveDate": {
+                "type": "string",
+                "format": "date",
+                "example": "2018-01-01",
+                "description": "The date the newest action on this job is effective."
+              },
+              "fullTimeEquivalent": {
+                "type": "string",
+                "example": "0.5",
+                "description": "The full time equivalency of the job."
+              },
+              "payBasis": {
+                "type": "string",
+                "enum": [
+                  "Academic",
+                  "Annual",
+                  "Hourly",
+                  "Lump",
+                  "No Pay Basis",
+                  "Summer Service",
+                  "Summer Session",
+                  "Unknown"
+                ],
+                "example": "Annual",
+                "description": "The pay basis for this position."
+              },
+              "employeeCategoryCode": {
+                "type": "string",
+                "example": "AS",
+                "description": "Unique identifier for an employee category."
+              },
+              "employeeCategory": {
+                "type": "string",
+                "example": "Academic Staff",
+                "description": "See this document for information on this field: https://kb.wisc.edu/ohr/policies/page.php?id=53496"
+              },
+              "jobCode": {
+                "type": "string",
+                "example": "IT002",
+                "description": "Unique identifier for the job title."
+              },
+              "businessTitle": {
+                "type": "string",
+                "example": "Software Engineer/Developer",
+                "description": "Business title of the person's position at this job."
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "person",
+              "supervisor"
+            ],
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              },
+              "supervisor": {
+                "description": "The supervisor for the job. If the job reports to a position that has 0 or greater than 2 people occupying it, this relationship is empty. If the job reports to a position occupied by 2 people, this relationship points to the person with the most recently entered job.",
+                "type": "object",
+                "properties": {
+                  "links": {
+                    "type": "object",
+                    "properties": {
+                      "related": {
+                        "type": "string",
+                        "example": "https://api.wisc.edu/people/123"
+                      }
+                    }
+                  },
+                  "data": {
+                    "type": "object",
+                    "properties": {
+                      "type": {
+                        "type": "string",
+                        "example": "people"
+                      },
+                      "id": {
+                        "type": "string",
+                        "example": "123"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "wiscard": {
+        "description": "Details and metadata from someone's Wiscard.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "wiscard"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "type": "object",
+            "required": [
+              "wiscardId",
+              "expirationDate",
+              "issueCode"
+            ],
+            "properties": {
+              "wiscardId": {
+                "description": "The ID number printed on this Wiscard.",
+                "type": "string",
+                "example": "123213213"
+              },
+              "expirationDate": {
+                "description": "The date this Wiscard will expire.",
+                "type": "string",
+                "format": "date",
+                "example": "2024-01-01"
+              },
+              "issueCode": {
+                "description": "The number of times a new Wiscard was issued for the holder of this Wiscard, starting with 0.",
+                "type": "string",
+                "example": "0"
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "names": {
+        "description": "Details about the names used to refer to a person.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "names"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/nameAttributes"
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "person": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "nameAttributes": {
+        "type": "object",
+        "required": [
+          "firstName",
+          "middleName",
+          "lastName",
+          "nameType",
+          "source"
+        ],
+        "properties": {
+          "firstName": {
+            "description": "A first name for this person. For the `nameType` of `nameInUse`, this name can only contain A-Z and a-z characters, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Amy"
+          },
+          "middleName": {
+            "description": "A middle name for this person. For the `nameType` of `nameInUse`, this name can only contain A-Z and a-z characters, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Marie"
+          },
+          "lastName": {
+            "description": "A last name for this person. For the `nameType` of `nameInUse`, this field can only be edited to change capitalization, space characters, single quotes, and hyphens.",
+            "type": "string",
+            "minLength": 1,
+            "maxLength": 30,
+            "pattern": "^[A-Za-z '-]*$",
+            "example": "Smith"
+          },
+          "nameType": {
+            "description": "The type of name for the person.",
+            "type": "string",
+            "enum": [
+              "nameInUse",
+              "primary"
+            ],
+            "example": "nameInUse"
+          },
+          "source": {
+            "description": "The source of the name.",
+            "type": "string",
+            "enum": [
+              "profile",
+              "IAM"
+            ],
+            "example": "profile"
+          }
+        }
+      },
+      "errors": {
+        "description": "An error",
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "integer",
+            "example": 400
+          },
+          "title": {
+            "type": "string",
+            "example": "Error title"
+          },
+          "detail": {
+            "type": "string",
+            "example": "Additional details about the error"
+          },
+          "links": {
+            "type": "object"
+          },
+          "meta": {
+            "type": "object"
+          },
+          "source": {
+            "type": "object"
+          }
+        }
+      },
+      "selfLink": {
+        "description": "The link to access a resource itself",
+        "type": "object",
+        "properties": {
+          "self": {
+            "type": "string",
+            "example": "https://api.wisc.edu/link/to/self"
+          }
+        }
+      },
+      "pagination": {
+        "description": "The links associated with a paginated collection",
+        "type": "object",
+        "properties": {
+          "prev": {
+            "description": "The previous page of data",
+            "type": "string",
+            "format": "uri-reference",
+            "example": "https://api.wisc.edu/people?page[number]=4"
+          },
+          "next": {
+            "description": "The next page of data",
+            "type": "string",
+            "format": "uri-reference",
+            "example": "https://api.wisc.edu/people?page[number]=6"
+          }
+        }
+      },
+      "toManyRelationshipObject": {
+        "description": "A generic relationship object",
+        "type": "object",
+        "properties": {
+          "links": {
+            "type": "object",
+            "properties": {
+              "related": {
+                "type": "string",
+                "example": "https://api.wisc.edu/link/to/related/object"
+              }
+            }
+          },
+          "data": {
+            "type": "array",
+            "items": {
+              "type": "object",
+              "properties": {
+                "type": {
+                  "type": "string",
+                  "example": "sampleType"
+                },
+                "id": {
+                  "type": "string",
+                  "example": "sampleId"
+                }
+              }
+            }
+          }
+        }
+      },
+      "toOneRelationshipObject": {
+        "description": "A generic relationship object",
+        "type": "object",
+        "properties": {
+          "links": {
+            "type": "object",
+            "properties": {
+              "related": {
+                "type": "string",
+                "example": "https://api.wisc.edu/link/to/related/object"
+              }
+            }
+          },
+          "data": {
+            "type": "object",
+            "properties": {
+              "type": {
+                "type": "string",
+                "example": "sampleType"
+              },
+              "id": {
+                "type": "string",
+                "example": "sampleId"
+              }
+            }
+          }
+        }
+      },
+      "resourceObject": {
+        "description": "A generic resource object",
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "sampleType"
+          },
+          "id": {
+            "type": "string",
+            "example": "sampleId"
+          },
+          "attributes": {
+            "type": "object",
+            "properties": {
+              "attribute1": {
+                "type": "string",
+                "example": "sampleStringAttribute"
+              },
+              "attribute2": {
+                "type": "number",
+                "example": 123
+              }
+            }
+          },
+          "relationships": {
+            "type": "object",
+            "properties": {
+              "relatedResource": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      },
+      "personId": {
+        "type": "string",
+        "description": "An ephemeral identifier used only in the Person API to adhere to the [JSON:API specification](https://jsonapi.org/format/#document-resource-object-identification). This ID may change if a person is split into two people or two people are merged into one person. This ID is used for paginating results or following other links returned in the API response. This ID should not be stored in a consuming system. Concatenating parts of the URL to form a link is discouraged. Instead, use the fully-formed links returned in an API response.",
+        "example": "12345"
+      },
+      "genericId": {
+        "type": "string",
+        "example": "12345",
+        "description": "Ephemeral ID used to adhere to the JSON:API specification. This ID should not be stored."
+      },
+      "webhookAttributes": {
+        "type": "object",
+        "required": [
+          "url",
+          "expired"
+        ],
+        "properties": {
+          "url": {
+            "type": "string",
+            "format": "url",
+            "example": "https://department.wisc.edu/person-api-webhook",
+            "description": "URL that accepts Person API webhook events. This URL must use HTTPS."
+          },
+          "token": {
+            "type": "string",
+            "readOnly": true,
+            "description": "A secret token sent with each webhook event. A server must verify this token when receiving a webhook from the Person API to ensure it is authenticate. This token is only returned when creating a webhook and cannot be set by the client. It cannot be retrieved again in future requests."
+          },
+          "expired": {
+            "type": "boolean",
+            "readOnly": false,
+            "description": "Indicates whether the webhook subscription has expired. This value can be set to false to un-expire a webhook but can not be set to true to expire it."
+          }
+        }
+      },
+      "webhookRequestAttributes": {
+        "type": "object",
+        "properties": {
+          "url": {
+            "type": "string",
+            "format": "url",
+            "example": "https://department.wisc.edu/person-api-webhook",
+            "description": "URL that accepts Person API webhook events. This URL must use HTTPS."
+          },
+          "expired": {
+            "type": "boolean",
+            "example": false,
+            "description": "Indicates whether the webhook subscription has expired. This value can be set to false to un-expire a webhook but can not be set to true to expire it."
+          }
+        }
+      },
+      "webhooks": {
+        "description": "A webhook represents the configuration for an application to subscribe to events for the Person API. A webhook is an HTTP request that will be sent to a server when data changes about a person.",
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links",
+          "relationships"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhooks"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookAttributes"
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "replay",
+              "webhookFilters",
+              "webhookRelationshipFilters"
+            ],
+            "properties": {
+              "replay": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              },
+              "webhookFilters": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              },
+              "webhookRelationshipFilters": {
+                "$ref": "#/components/schemas/toManyRelationshipObject"
+              }
+            }
+          }
+        }
+      },
+      "replayWebhookRequestAttributes": {
+        "type": "object",
+        "required": [
+          "replayFromTime"
+        ],
+        "properties": {
+          "replayFromTime": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2019-01-01T00:00:00Z",
+            "description": "The time to start replaying events from. This is an ISO 8601 date and time with the following format : YYYY-MM-DDTHH:MM:SSZ. The time must be in UTC."
+          }
+        }
+      },
+      "webhookFilterAttributes": {
+        "type": "object",
+        "required": [
+          "attribute",
+          "operator",
+          "values"
+        ],
+        "properties": {
+          "attribute": {
+            "type": "string",
+            "example": "jobs.divisionCode",
+            "description": "A valid attribute or relationship attribute on the people resource."
+          },
+          "operator": {
+            "type": "string",
+            "example": "STARTS_WITH",
+            "description": "The comparison to be performed on the balues. Valid operators are - 'STARTS_WITH', 'ENDS_WITH', 'CONTAINS', or 'EQUALS'."
+          },
+          "values": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "example": [
+              "A192",
+              "A193"
+            ],
+            "description": "A list of values to compare against. Values are required and must be a list of upto 10 non-empty strings."
+          }
+        }
+      },
+      "webhookFilters": {
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhookFilters"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookFilterAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "webhook"
+            ],
+            "properties": {
+              "webhook": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      },
+      "webhookRelationshipFilterAttributes": {
+        "type": "object",
+        "required": [
+          "relationship"
+        ],
+        "properties": {
+          "relationship": {
+            "type": "string",
+            "example": "jobs",
+            "description": "A valid relationship on the people resource.  If there are no changes to this relationship in a webhook event, the webhook event won't be sent to you."
+          }
+        }
+      },
+      "webhookRelationshipFilters": {
+        "type": "object",
+        "required": [
+          "type",
+          "id",
+          "attributes",
+          "links"
+        ],
+        "properties": {
+          "type": {
+            "type": "string",
+            "example": "webhookRelationshipFilters"
+          },
+          "id": {
+            "$ref": "#/components/schemas/genericId"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+          },
+          "relationships": {
+            "type": "object",
+            "required": [
+              "webhook"
+            ],
+            "properties": {
+              "webhook": {
+                "$ref": "#/components/schemas/toOneRelationshipObject"
+              }
+            }
+          },
+          "links": {
+            "$ref": "#/components/schemas/selfLink"
+          }
+        }
+      }
+    },
+    "requestBodies": {
+      "newName": {
+        "description": "A name request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "names"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/nameAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updatedName": {
+        "description": "A name request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "id",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "names"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/nameAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhook": {
+        "description": "A webhook request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhooks"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updatedWebhook": {
+        "description": "A webhook request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "id"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhooks"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "replayWebhook": {
+        "description": "A webhook replay request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "replay"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/replayWebhookRequestAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhookFilter": {
+        "description": "A webhook filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookFilters"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updateWebhookFilter": {
+        "description": "A webhook filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookFilters"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "newWebhookRelationshipFilter": {
+        "description": "A webhook relationship filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type",
+                    "attributes"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookRelationshipFilters"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "updateWebhookRelationshipFilter": {
+        "description": "A webhook relationship filter request body.",
+        "required": true,
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "object",
+                  "required": [
+                    "type"
+                  ],
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "example": "webhookRelationshipFilters"
+                    },
+                    "id": {
+                      "$ref": "#/components/schemas/genericId"
+                    },
+                    "attributes": {
+                      "$ref": "#/components/schemas/webhookRelationshipFilterAttributes"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "responses": {
+      "people": {
+        "description": "A collection of people",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of people",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/people"
+                  }
+                },
+                "links": {
+                  "description": "Self and pagination links",
+                  "allOf": [
+                    {
+                      "$ref": "#/components/schemas/selfLink"
+                    },
+                    {
+                      "$ref": "#/components/schemas/pagination"
+                    }
+                  ]
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-people": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "emailAddress": "john.smith@wisc.edu",
+                        "firstName": "John",
+                        "lastName": "Smith",
+                        "officeAddress": "1210 W Dayton St, Madison, WI 53706",
+                        "officePhoneNumber": "608-555-1234"
+                      },
+                      "id": "100",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/100"
+                      },
+                      "meta": {
+                        "ferpa": false,
+                        "ferpaAttributes": [],
+                        "privateAttributes": []
+                      },
+                      "relationships": {
+                        "identifiers": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "identifiers"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/identifiers"
+                          }
+                        },
+                        "jobs": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "jobs"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/jobs"
+                          }
+                        },
+                        "names": {
+                          "data": [
+                            {
+                              "id": "100",
+                              "type": "names"
+                            }
+                          ],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/names"
+                          }
+                        },
+                        "wiscard": {
+                          "data": {
+                            "id": "100",
+                            "type": "wiscard"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100/wiscard"
+                          }
+                        }
+                      },
+                      "type": "people"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "people-id": {
+        "description": "A single person",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/people"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-people": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "emailAddress": "john.smith@wisc.edu",
+                      "firstName": "John",
+                      "lastName": "Smith",
+                      "officeAddress": "1210 W Dayton St, Madison, WI 53706",
+                      "officePhoneNumber": "608-555-1234"
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/100"
+                    },
+                    "meta": {
+                      "ferpa": false
+                    },
+                    "relationships": {
+                      "identifiers": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "identifiers"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/identifiers"
+                        }
+                      },
+                      "jobs": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "jobs"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/jobs"
+                        }
+                      },
+                      "names": {
+                        "data": [
+                          {
+                            "id": "100",
+                            "type": "names"
+                          }
+                        ],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/names"
+                        }
+                      },
+                      "wiscard": {
+                        "data": {
+                          "id": "100",
+                          "type": "wiscard"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100/wiscard"
+                        }
+                      }
+                    },
+                    "type": "people"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "identifiers": {
+        "description": "A collection of identifiers.  These may be: `pvi` (Publicly Visible Identifier, a unique value from DoIT Identity and Access Management), `netId` (username for the NetID Login Service), `photoId` (from a person's Wiscard), or `emplId` (from Human Resources System - HRS - for employees, or from Student Information System - SIS -for students).",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of identifiers",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/identifiers"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-identifiers-current": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "name": "pvi",
+                        "source": "IAM",
+                        "value": "UW123A456",
+                        "current": true
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "identifiers"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/identifiers"
+                  }
+                }
+              },
+              "example-identifier-historical": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "name": "pvi",
+                        "source": "IAM",
+                        "value": "UW123A123",
+                        "current": false
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "identifiers"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/identifiers"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "jobs": {
+        "description": "A collection of jobs",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of jobs",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/jobs"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-jobs": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "departmentUnit": "DOIT/AIS/ENTERPRISE INTEGRAT",
+                        "division": "INFORMATION TECHNOLOGY",
+                        "divisionCode": "A067040",
+                        "title": "Product Manager",
+                        "beginDate": "2020-01-01",
+                        "endDate": "2080-01-01",
+                        "effectiveDate": "2020-01-01",
+                        "fullTimeEquivalent": "1",
+                        "payBasis": "Annual",
+                        "employeeCategory": "Academic Staff",
+                        "employeeCategoryCode": "AS",
+                        "jobCode": "IT002",
+                        "businessTitle": "Department Product Manager"
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        },
+                        "supervisor": {
+                          "data": {
+                            "id": "200",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/200"
+                          }
+                        }
+                      },
+                      "type": "jobs"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/jobs"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "wiscard": {
+        "description": "Details and metadata about a person's Wiscard.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/wiscard"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                },
+                "included": {
+                  "description": "Included related resources",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/resourceObject"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "example-wiscard": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "wiscardId": "1234567890",
+                      "issueCode": "0",
+                      "expirationDate": "2122-07-01"
+                    },
+                    "id": "100",
+                    "relationships": {
+                      "person": {
+                        "data": {
+                          "id": "100",
+                          "type": "people"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100"
+                        }
+                      }
+                    },
+                    "type": "wiscard"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/wiscard"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "names": {
+        "description": "A collection of names.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of names",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/names"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-names": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "firstName": "Amy",
+                        "middleName": "Marie",
+                        "lastName": "Smith",
+                        "nameType": "nameInUse",
+                        "source": "profile"
+                      },
+                      "id": "100",
+                      "relationships": {
+                        "person": {
+                          "data": {
+                            "id": "100",
+                            "type": "people"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/100"
+                          }
+                        }
+                      },
+                      "type": "names",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/100/names/200"
+                      }
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/names"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleName": {
+        "description": "A single name.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/names"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-names": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "firstName": "Amy",
+                      "middleName": "Marie",
+                      "lastName": "Smith",
+                      "nameType": "nameInUse",
+                      "source": "profile"
+                    },
+                    "id": "100",
+                    "relationships": {
+                      "person": {
+                        "data": {
+                          "id": "100",
+                          "type": "people"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/100"
+                        }
+                      }
+                    },
+                    "type": "names",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/100/names/200"
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/100/names/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhooks": {
+        "description": "A collection of webhooks.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhooks.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhooks"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhooks": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "url": "https://department.wisc.edu/person-api-webhook",
+                        "expired": false
+                      },
+                      "id": "100",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100"
+                      },
+                      "type": "webhooks",
+                      "relationships": {
+                        "replay": {
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                          }
+                        },
+                        "webhookFilters": {
+                          "data": [],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                          }
+                        },
+                        "webhookRelationshipFilters": {
+                          "data": [],
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                          }
+                        }
+                      }
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhook": {
+        "description": "A single webhook.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhooks"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhook": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "url": "https://department.wisc.edu/person-api-webhook",
+                      "expired": false
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100"
+                    },
+                    "type": "webhooks",
+                    "relationships": {
+                      "replay": {
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                        }
+                      },
+                      "webhookFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                        }
+                      },
+                      "webhookRelationshipFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                        }
+                      }
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "createdWebhook": {
+        "description": "A single just created webhook.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhooks"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhook": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "url": "https://department.wisc.edu/person-api-webhook",
+                      "token": "16f6f440-7317-41f2-9239-6207519b3ad0",
+                      "expired": false
+                    },
+                    "id": "100",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100"
+                    },
+                    "type": "webhooks",
+                    "relationships": {
+                      "replay": {
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/replay"
+                        }
+                      },
+                      "webhookFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/filters"
+                        }
+                      },
+                      "webhookRelationshipFilters": {
+                        "data": [],
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                        }
+                      }
+                    }
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhookFilters": {
+        "description": "A collection of webhook filters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhook filters.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhookFilters"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilters": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "attribute": "firstName",
+                        "operator": "STARTS_WITH",
+                        "values": [
+                          "Ben",
+                          "Ber",
+                          "Bel",
+                          "Bes"
+                        ]
+                      },
+                      "id": "123",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100/filters/123"
+                      },
+                      "relationships": {
+                        "webhook": {
+                          "data": {
+                            "id": "100",
+                            "type": "webhooks"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100"
+                          }
+                        }
+                      },
+                      "type": "webhookFilters"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/filters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhookFilter": {
+        "description": "A single webhook filter.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhookFilters"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilter": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "attribute": "firstName",
+                      "operator": "STARTS_WITH",
+                      "values": [
+                        "Ben",
+                        "Ber",
+                        "Bel",
+                        "Bes"
+                      ]
+                    },
+                    "id": "123",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100/filters/123"
+                    },
+                    "relationships": {
+                      "webhook": {
+                        "data": {
+                          "id": "100",
+                          "type": "webhooks"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100"
+                        }
+                      }
+                    },
+                    "type": "webhookFilters"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/filters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "webhookRelationshipFilters": {
+        "description": "A collection of webhook relationship filters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "description": "A collection of webhook filters.",
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/webhookRelationshipFilters"
+                  }
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookRelationshipFilters": {
+                "value": {
+                  "data": [
+                    {
+                      "attributes": {
+                        "relationship": "identifiers"
+                      },
+                      "id": "123",
+                      "links": {
+                        "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters/123"
+                      },
+                      "relationships": {
+                        "webhook": {
+                          "data": {
+                            "id": "100",
+                            "type": "webhooks"
+                          },
+                          "links": {
+                            "related": "https://api.wisc.edu/people/webhooks/100"
+                          }
+                        }
+                      },
+                      "type": "webhookRelationshipFilters"
+                    }
+                  ],
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "singleWebhookRelationshipFilter": {
+        "description": "A single webhook relationship filter.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "required": [
+                "data",
+                "links"
+              ],
+              "properties": {
+                "data": {
+                  "$ref": "#/components/schemas/webhookRelationshipFilters"
+                },
+                "links": {
+                  "$ref": "#/components/schemas/selfLink"
+                }
+              }
+            },
+            "examples": {
+              "example-webhookFilter": {
+                "value": {
+                  "data": {
+                    "attributes": {
+                      "relationship": "identifiers"
+                    },
+                    "id": "123",
+                    "links": {
+                      "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters/123"
+                    },
+                    "relationships": {
+                      "webhook": {
+                        "data": {
+                          "id": "100",
+                          "type": "webhooks"
+                        },
+                        "links": {
+                          "related": "https://api.wisc.edu/people/webhooks/100"
+                        }
+                      }
+                    },
+                    "type": "webhookRelationshipFilters"
+                  },
+                  "links": {
+                    "self": "https://api.wisc.edu/people/webhooks/100/relationshipFilters"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "not-found": {
+        "description": "Unable to find the specified record",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 404,
+                      "title": "Not Found",
+                      "detail": "Requested resource not found."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "not-acceptable": {
+        "description": "Servers respond with a 406 Not Acceptable status code if a request’s Accept header contains the JSON:API media type and all instances of that media type are modified with media type parameters.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-acceptable-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 406,
+                      "title": "Not Acceptable",
+                      "detail": "Request's Accept header contained the JSON:API media type and all instances of that media type were modified with media type parameters."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "unsupported-media-type": {
+        "description": "Request includes a body but not the valid JSON API Content-Type header: application/vnd.api+json",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "unsupported-media-type-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 415,
+                      "title": "Unsupported Media Type",
+                      "detail": "Requests with a body must include the Content-Type header with a value of application/vnd.api+json"
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "forbidden": {
+        "description": "The API call is authenticated but the client isn't allowed to perform the requested operation. This can occur when trying to update a resource when granted read-only access.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "name-update-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 403,
+                      "title": "Forbidden",
+                      "detail": "Client is not allowed to create, update, or delete a person's name."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "too-many-requests": {
+        "description": "The API quota has been exceeded.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 429,
+                      "title": "Too Many Requests",
+                      "detail": "The quota has been exceeded."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "unauthorized": {
+        "description": "Incorrect or expired OAuth token.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "unauthorized-response": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 401,
+                      "title": "Unauthorized",
+                      "detail": "Invalid OAuth authentication - InvalidAccessToken"
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "internal-server-error": {
+        "description": "An unexpected error.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "not-found-example": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 500,
+                      "title": "Internal Server Error",
+                      "detail": "Something went wrong in the server-side."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      },
+      "bad-request": {
+        "description": "A bad request.",
+        "content": {
+          "application/vnd.api+json": {
+            "schema": {
+              "type": "object",
+              "properties": {
+                "errors": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/errors"
+                  }
+                }
+              }
+            },
+            "examples": {
+              "application/vnd.api+json": {
+                "value": {
+                  "errors": [
+                    {
+                      "status": 400,
+                      "title": "Bad Request",
+                      "detail": "Invalid properties in query parameters - resource type 'people' has no attribute 'invalid'."
+                    }
+                  ]
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "parameters": {
+      "id": {
+        "name": "id",
+        "description": "ID of a person. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response. To get a person by an ID, use query parameters to search by a specific identifier. Example: /people?filter[identifiers.name]=netId&filter[identifiers.value]=bbadger",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "$ref": "#/components/schemas/personId"
+        }
+      },
+      "nameId": {
+        "name": "nameId",
+        "description": "ID of a name. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "101",
+        "required": true,
+        "schema": {
+          "$ref": "#/components/schemas/genericId"
+        }
+      },
+      "webhookId": {
+        "name": "webhookId",
+        "description": "ID of a webhook. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "$ref": "#/components/schemas/genericId"
+        }
+      },
+      "filterId": {
+        "name": "filterId",
+        "description": "ID of a webhook filter. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "$ref": "#/components/schemas/genericId"
+        }
+      },
+      "relationshipFilterId": {
+        "name": "relationshipFilterId",
+        "description": "ID of a webhook relationship filter. This parameter should not be manually built/concatenated, but instead be used by following the fully-formed links returned in an API response.",
+        "in": "path",
+        "example": "100",
+        "required": true,
+        "schema": {
+          "$ref": "#/components/schemas/genericId"
+        }
+      },
+      "filter": {
+        "name": "filter",
+        "in": "query",
+        "description": "Filter results of query using the [filter query parameter family](https://jsonapi.org/recommendations/#filtering). Refer to the [Person API Documentation](/person-api/filter-query-parameter) for more information about the `filter` query param.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "attribute": {
+              "type": "string",
+              "example": "firstName"
+            }
+          }
+        }
+      },
+      "include": {
+        "name": "include",
+        "in": "query",
+        "description": "[include related resources](https://jsonapi.org/format/#fetching-includes). The resources to include need to be direct relationships. Nested relationships are not supported. For example, `include=jobs,identifiers` is supported but `include=person.jobs` is not supported.",
+        "schema": {
+          "type": "string"
+        }
+      },
+      "fields": {
+        "name": "fields",
+        "in": "query",
+        "description": "Specify the list of fields you would like to return for each resource type.  For example, `fields[people]=firstName,lastName` will just return the names for people.  If you are including related resources with 'includes' you can also specify fields on those resources as well.  For example, `includes=jobs&fields[people]=jobs&fields[jobs]=title` will just return titles for jobs.  See [Sparse Fieldsets](https://jsonapi.org/format/#fetching-sparse-fieldsets) for more details.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "type": {
+              "type": "string",
+              "example": "people"
+            }
+          }
+        }
+      },
+      "page": {
+        "name": "page",
+        "in": "query",
+        "description": "Define options for pagination of responses. For example, `page[size]=5&page[after]=400&page[before]=800` will return a response with data about 5 people whose `id` value falls after `400` but before `800`. So `page[size]` determines the number of people resources in a response, `page[after]` is the ID of the person at the end of the previous page, `page[before]` is the ID of the person at the start of the next page.",
+        "required": false,
+        "style": "deepObject",
+        "explode": true,
+        "schema": {
+          "type": "object",
+          "properties": {
+            "size": {
+              "type": "integer",
+              "example": 50,
+              "description": "Size of page for paginated results."
+            },
+            "after": {
+              "$ref": "#/components/schemas/personId"
+            },
+            "before": {
+              "$ref": "#/components/schemas/personId"
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file